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

Dan*_*ani 41 xcode objective-c

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

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

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

Dav*_*ong 84

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

  • 关于#5 - 不完全.属于*any*root类的实例方法,不仅仅是NSObject,可以作为类方法调用.NSObject确实广泛使用了它,但它不仅限于那个类.此外,Class对象不是NSObject的子类 - Class结构的元类指针指向父类的Class结构,而根类是NULL. (8认同)
  • @Robert在类方法中使用`self`是一种很好的做法,因为它尊重可能发生的任何子类.这就是为什么`[NSMutableArray array]`返回一个`NSMutableArray`而不是一个`NSArray`的原因; 它基本上实现为`return [[[self alloc] init] autorelease];` (4认同)

Jon*_*pan 8

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

self 在这些情况下是允许的,这样你就可以:

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


She*_*ley 5

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