Objective-C中的“超级”是什么? (自我!=超级)?

我已经阅读下面的问题,故事SEEMS简单:

Objective-C中的超级特性是什么?

然而…

- (id) init { NSLog(@"self=%p, super=%p", self, super); } 

打印出“self = 0xa83dc50,super = 0xbfffe8d0”。 地址不一样???!?!?

第二个地址看起来像一个“特殊的价值”或什么的。 这是什么意思?

感谢bbum指出这个值是编译器用来实现“超级”行为的特殊结构的堆栈地址。


我可以调用[超级初始化],并且调用似乎工作,或者至less,没有爆炸…不立即。 调用[((id)0xbfffe8d0)init]会导致EXC_BAD_ACCESS失败。

然后是真正的WEIRD部分…..我有一段代码,因为没有解释的理由抛出“NSGenericException:枚举时突变集合”exception。 在一个不同的对象(基本上是一个指向NSEnumerator的包装器)里面,注释掉“[super init]”的调用会导致exception不会发生。 如果可以的话,我会拿出一个$$$奖励来回答这个问题。

“id sups =(id)0xbfffe8d0”…这也导致“集合被修改”。 … WTF? 好的,所以我正在发布第二个问题的bizzariotity …

我原来是来到这里的一个“怪异的症状”的错误,结果是完全不相关的(典型的这样的事情): 是否投了一个地址(ID)有副作用? 地址0xbfffe8d0是否特殊? (修正:问题是与_NSCallStackArray)

但是,上面的内容仍然有效,反应仍然很好。 如果你想更深入地了解ObjC,请阅读它。

你正在和幕后的男人搞混,他正在惩罚你…… 🙂

super是一个编译器魔术,真的。 当你说[super doSomething] ,编译器会发出一个objc_msgSendSuper()而不是objc_msgSend()的调用。 大部分时间 – 有一些特殊情况。

一般来说,你应该把super作为方法调用的唯一目标 。 它永远不应该存储在任何地方,绝不应该被视为任何东西, 消息的目标expression。

实际上,涉及存储的super应该可能被编译器标记。

就你的bug而言,这听起来像是内存损坏,过度释放和/或并发的情况。 您需要提供更多与枚举相关的代码和其他相关代码以进一步推导。