我已阅读下面的问题和故事SEEMS simple:
Objective-C 中的 super 到底是什么? https://stackoverflow.com/questions/3095360/what-exactly-is-super-in-objective-c
Yet ...
- (id) init
{
NSLog(@"self=%p, super=%p", self, super);
}
打印出“self=0xa83dc50,super=0xbfffe8d0”。地址不一样???!?!?
第二个地址看起来像是“特殊值”之类的。这是什么意思?
感谢 bbum 指出该值是编译器用来实现“超级”行为的特殊结构的堆栈地址。
我可以调用 [super init] 并且该调用似乎有效,或者至少没有爆炸......不会立即发生。调用 [((id)0xbfffe8d0) init] 失败,并出现 EXC_BAD_ACCESS。
然后是非常奇怪的部分......
我有一段代码,由于没有任何解释的原因,抛出“NSGenericException:集合在枚举时发生变异”异常。在不同的对象(基本上是一个具有指向 NSEnumerator 的指针的包装器)内,注释掉对“[super init]”的调用会导致异常不会发生。如果可以的话,我愿意为这个令人费解的问题的答案提供 $$$ 奖励。
“id sus = (id)0xbfffe8d0”...这也会导致“集合被修改”。 ... WTF?好的,所以我针对这种怪异行为发布了第二个问题......