为什么自我允许在目标c的静态上下文中
为什么在Objective-C的静态上下文中使用self
?
我认为这是允许的,然后我遇到了内存错误,花了一个星期才发现, self
不是调用类的其他静态方法而不是input类名的别名。
Xcode和它的编译器在寻找常见的陷阱方面似乎非常聪明,为什么它甚至不会产生这样的警告?
- Objective-C中没有这样的“静态上下文”。 我们有什么是“阶级方法”。 他们绝对不是 “静态”的方法。
- 类方法(带有
+
的前缀) 实际上只是特定Class
对象上的实例方法。 (你的头脑是否爆炸?)因为你有一个实例方法中可以访问的self
variables,所以你自然也有一个self
variables可以在类方法中访问。 - 在类方法中,
self
指向类本身 。 - 就像你可以在一个实例方法中执行
[self performAction]
来调用这个特定实例上的方法一样,你可以在一个类方法中执行[self performClassAction]
来调用这个特定类的方法。 - 所有的
Class
对象都是NSObject
子类。 所以你可以在任何Class
对象上使用任何NSObject
实例方法。 (你的头脑是否再次爆炸?)
self
只能在Objective-C方法的上下文中使用。 通过“静态上下文”,我假设你的意思是在一个类方法(即,其签名以+
而不是-
开始的方法)。你断言“ self
不是调用其他静态方法的别名”是不正确的。
在这些情况下,允许self
,以便您可以:
- 将类作为对象传递,因为所有的Objective-C类本身都是对象
- 发送消息到一个类,而不指定类名,以防子方法被覆盖(
[Foo bar]
将始终使用Foo
的实现;[self bar]
将使用self
可用的任何实现。
这是允许的,因为self
在类方法中使用时会引用类对象。 这就是你所说的“静态环境”吗? 如果是这样,你有什么内存错误,否则build议?