下面的代码行导致我的程序以一种非常奇怪的方式中断......
id foo = (id)0xbfffe8d0;
然而,这没有问题:
int foo = (int)(id)0xbfffe8d0;
即使这样也没有问题:
int magicAddr = 0xbfffe8d0;
id foo = (id)magicAddr;
W.T.F.?
只需在特定的 init 方法中插入该行代码就会导致我对数组的迭代失败,并显示“NSGenericException:集合在枚举时发生突变”。注释掉该行会导致异常不会发生。这段代码是单线程的。该行为是确定性的,并且始终会一遍又一遍地重现,并且当我注释掉该行时始终不会重现。 “foo”是一个虚构的变量,再也不会被引用。没有其他代码引用“foo”。
这条线有副作用吗?将数字转换为 (id) 是否有副作用?
有关我正在做的事情的更多详细信息:
- 我运行 NSLog(@"self=%p, super=%p", self, super) 并打印出“self=0xa83dc50, super=0xbfffe8d0”,这让我问这个问题 https://stackoverflow.com/questions/9961527/what-is-super-in-objective-c-self-super
- 我不知道 0xbfffe8d0 值是什么或意味着什么。
- 我粘贴的行位于一个类的 init2 方法内,该类在引发异常的集合上引用了 NSEnumerator。该类不会改变集合,甚至不会引用集合。
确切的代码:(已删除,不相关或有趣)
No. id
is a typedef
对于指针类型,分配给指针没有副作用。您的代码中其他地方还有其他错误,如果没有看到更多代码,就不可能说出来。
0xbfffe8d0
是指向堆栈中地址的指针。当在没有优化的情况下编译时,赋值会写入值0xbffe8d0
到你的堆栈中,但该值永远不会在任何地方被读取。因此,它确实具有 (a) 将该函数的堆栈帧大小增加 4 个字节以及 (b) 更改函数代码的大小并偏移所有后续代码的效果。这些更改很可能会导致程序中其他位置的错误出现或不出现。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)