为什么在目标c中允许自我在静态环境中

时间:2011-06-12 23:37:50

标签: objective-c xcode

为什么在Objective-C的静态上下文中允许使用self

我认为这是允许的,然后我遇到内存错误,花了我一个星期才发现self不是从类调用其他静态方法而不是键入类名的别名。

Xcode及其编译器似乎非常聪明地找到常见的陷阱,为什么它甚至不会产生这样的警告呢?

3 个答案:

答案 0 :(得分:83)

  1. Objective-C中没有“静态上下文”这样的东西。我们所拥有的是“阶级方法”。它们肯定是不是“静态”方法。
  2. 类方法(以+为前缀的方法)真正只是特定Class对象上的实例方法。 (你的思想是否只是爆炸?)由于你在实例方法中可以访问self变量,你自然也可以在类方法中访问self变量。
  3. 在类方法中,self指向类本身
  4. 正如您可以在实例方法中执行[self performAction]来调用此特定实例上的方法一样,您可以在类方法中执行[self performClassAction]来调用此特定类的方法。
  5. 所有Class个对象都是NSObject的子类。因此,您可以在任何NSObject对象上使用任何Class实例方法。 (你的思想是否只是再次爆炸?)

答案 1 :(得分:8)

self仅允许在Objective-C方法的上下文中使用。通过“静态上下文”,我假设你的意思是在一个类方法中(即,其签名以+而不是-开头。)你的断言“self不是别名调用其他静态方法“是不正确的。

在这些情况下允许

self,以便您可以:

  1. 将类作为对象传递,因为所有Objective-C类本身都是对象
  2. 在没有指定类名的情况下向类发送消息,以防在子类中重写方法([Foo bar]将始终使用Foo的实现; [self bar]将使用任何实现可在self。)
  3. 中找到

答案 2 :(得分:5)

这是允许的,因为self 在类方法中使用时引用了类对象。这就是“静态背景”的意思吗?如果是这样,你有什么记忆错误,否则建议?