在比较Objective C中的指针时,我的代码出了什么问题?

时间:2012-11-21 12:19:11

标签: iphone objective-c

我有

static __weak ExplorerController *_rootExplorer = nil;

_rootExplorer = self;            
NSAssert(_rootExplorer == self, @"????");

有效。

在dealloc中,我尝试这样做

bool b = _rootExplorer == self;

这是假的,但是调试器清楚地指出两个对象是相同的并且具有相同的物理地址。

当我这样做时

long n = (long) (_rootExplorer);
long n2 = (long) (self);

n2的数字非常大,n的数字为零。但_rootExplorer不是nil。但是,如果我在非dealloc的其他函数中执行相同操作,则nn2相同。

我的代码出了什么问题?我试图保持对堆栈中某个导航控制器的弱引用,并且在展开期间,我需要释放资源,但只允许引用的控制器执行它。

2 个答案:

答案 0 :(得分:1)

Apple的ARC documentation说,“当没有对该对象的强引用时,弱引用设置为nil。”所以,我认为你的代码没有任何问题(......除了,在某种意义上,它的位置是在ARC完成其工作之后)。

答案 1 :(得分:1)

据推测,你打算给_rootExplorer发消息,告诉它清理?如果是这样,只需给它发消息 - 如果它真的是零,你的消息将被忽略而不会造成伤害。

如果它真的是零,那么你可能在某个地方出现了一个错误,导致它在dealloc之前被设置 - 也许它所指向的对象被解除分配?

切向上,您可能无法信任调试器以获取正确的值,尤其是在使用lldb时。这个领域有一些已知的错误。可能还有比赛 - 也许你的_rootExplorer与你自己的对象同时被解除分配,并且在调试器中停止恰好会改变看起来发生的顺序?