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



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

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

Xcode及其编译器似乎非常善于发现常见的陷阱,为什么它甚至没有生成类似的警告?

  1. 在Objective-C中不存在"静态上下文"。取而代之的是"类方法"。它们肯定是而不是"静态"方法
  2. 类方法(前缀为+的方法)实际上只是特定Class对象上的实例方法。(你的想法是不是爆炸了?)既然你有一个self变量可以在实例方法中访问,那么你自然也有一个可以在类方法中访问的self变量
  3. 在类方法中,self指向类本身
  4. 正如您可以在实例方法中执行[self performAction]来调用此特定实例上的方法一样,您也可以在类方法中执行[self performClassAction]来调用此特殊类上的方法
  5. 所有的Class对象都是NSObject的子类。因此,您可以在任何Class对象上使用任何NSObject实例方法。(你是不是又疯了?)

self只允许在Objective-C方法的上下文中使用。我假设你所说的"静态上下文"是指类方法(即签名以+而非-开头的方法)内。你断言"self不是调用其他静态方法的别名"是不正确的。

self在这些情况下是允许的,因此您可以:

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

这是允许的,因为self在类方法中使用时确实引用类对象。这就是你所说的"静态上下文"吗?如果是的话,你有什么内存错误,这表明情况并非如此?

最新更新