【发布时间】:2012-04-01 02:54:17
【问题描述】:
我已经阅读了下面的问题,故事看起来很简单:
What exactly is super in Objective-C?
然而……
- (id) init
{
NSLog(@"self=%p, super=%p", self, super);
}
打印出“self=0xa83dc50, super=0xbfffe8d0”。地址不一样???!?!?
第二个地址似乎是一个“特殊值”或其他东西。什么意思?
感谢 bbum 指出这个值是编译器用来实现“超级”行为的特殊结构的堆栈地址。
我可以调用 [super init] 并且调用似乎有效,或者至少没有爆炸……不会立即爆炸。调用 [((id)0xbfffe8d0) init] 因 EXC_BAD_ACCESS 而失败。
然后是真正奇怪的部分..... 我有一段代码无缘无故抛出“NSGenericException:集合在被枚举时发生了变异”异常。在 DIFFERENT 对象(基本上是具有指向 NSEnumerator 的指针的包装器)内,注释掉对“[super init]”的调用会导致异常不会发生。如果可以的话,我会奖励 $$$ 来回答那个令人费解的问题。
"id sups = (id)0xbfffe8d0" ...这也会导致“集合被修改”。 ... 怎么回事?好的,所以我要针对这种怪异的问题发布第二个问题......
我最初是带着其中一个“奇怪的症状”错误来到这里的,结果证明这是完全不相关的(典型的此类事情):Does casting an address to (id) have side-effects??? Is Address 0xbfffe8d0 special? (fixed: issue was with _NSCallStackArray)
但是,行上面的内容仍然有效,并且响应仍然很好。如果您想更深入地了解 ObjC,请阅读它。
【问题讨论】:
-
除了你的其他问题,0xbfffe8d0 大概是一个代码地址,但没有理由期望它从一个编译到下一个编译都是一样的。将该文字值转换为指针基本上只是从随机数创建一个指针。
-
其实是栈地址,和代码地址不是一回事。从一个运行到下一个运行甚至都不一样!
-
在同一次运行中,堆栈地址从一个瞬间到下一个瞬间都不相同。
标签: iphone objective-c ios macos