为什么在Objective-C的静态上下文中允许使用self
?
我认为这是允许的,然后我遇到了内存错误,花了一周时间才发现self
不是从类中调用其他静态方法的别名,而不是键入类名。
Xcode及其编译器似乎非常善于发现常见的陷阱,为什么它甚至没有生成类似的警告?
- 在Objective-C中不存在"静态上下文"。取而代之的是"类方法"。它们肯定是而不是"静态"方法
- 类方法(前缀为
+
的方法)实际上只是特定Class
对象上的实例方法。(你的想法是不是爆炸了?)既然你有一个self
变量可以在实例方法中访问,那么你自然也有一个可以在类方法中访问的self
变量 - 在类方法中,
self
指向类本身 - 正如您可以在实例方法中执行
[self performAction]
来调用此特定实例上的方法一样,您也可以在类方法中执行[self performClassAction]
来调用此特殊类上的方法 - 所有的
Class
对象都是NSObject
的子类。因此,您可以在任何Class
对象上使用任何NSObject
实例方法。(你是不是又疯了?)
self
只允许在Objective-C方法的上下文中使用。我假设你所说的"静态上下文"是指类方法(即签名以+
而非-
开头的方法)内。你断言"self
不是调用其他静态方法的别名"是不正确的。
self
在这些情况下是允许的,因此您可以:
- 将类作为对象传递,因为所有Objective-C类本身都是对象
- 在子类中重写方法的情况下,向类发送消息而不指定类名(
[Foo bar]
将始终使用Foo
的实现;[self bar]
将使用self
中可用的任何实现。)
这是允许的,因为self
在类方法中使用时确实引用类对象。这就是你所说的"静态上下文"吗?如果是的话,你有什么内存错误,这表明情况并非如此?