0

我有

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。但是,如果我在其他函数中做同样的事情,那不是deallocn并且n2是相同的。

我的代码有什么问题?我试图保持对堆栈中导航控制器之一的弱引用,并且在展开期间,我需要释放资源,但只允许引用的控制器这样做。

4

2 回答 2

1

Apple 的ARC 文档说:“当对象没有强引用时,弱引用设置为 nil。” 因此,我认为您的代码没有任何问题(...除了在某种意义上,它的位置在 ARC 完成工作之后)。

于 2012-11-21T12:25:17.507 回答
1

大概您打算向 _rootExplorer 发送消息,告诉它进行清理?如果是这样,只需向它发送消息 - 如果它真的为零,您的消息将被忽略而不会造成任何伤害。

如果它真的为零,那么您可能在某个地方遇到了一个错误,导致它在 dealloc 之前以这种方式设置 - 也许它指向的对象正在被释放?

切线地,您可能无法信任调试器来获取正确的值,尤其是在您使用 lldb 时。这方面存在已知的错误。也可能存在竞争 - 也许您的 _rootExplorer 与您自己的对象在同一时间被释放,并且在调试器中停止只是碰巧改变了似乎发生的顺序?

于 2012-11-21T15:56:12.920 回答