我有
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
的其他函数中执行相同操作,则n
和n2
相同。
我的代码出了什么问题?我试图保持对堆栈中某个导航控制器的弱引用,并且在展开期间,我需要释放资源,但只允许引用的控制器执行它。
答案 0 :(得分:1)
Apple的ARC documentation说,“当没有对该对象的强引用时,弱引用设置为nil。”所以,我认为你的代码没有任何问题(......除了,在某种意义上,它的位置是在ARC完成其工作之后)。
答案 1 :(得分:1)
据推测,你打算给_rootExplorer发消息,告诉它清理?如果是这样,只需给它发消息 - 如果它真的是零,你的消息将被忽略而不会造成伤害。
如果它真的是零,那么你可能在某个地方出现了一个错误,导致它在dealloc之前被设置 - 也许它所指向的对象被解除分配?
切向上,您可能无法信任调试器以获取正确的值,尤其是在使用lldb时。这个领域有一些已知的错误。可能还有比赛 - 也许你的_rootExplorer与你自己的对象同时被解除分配,并且在调试器中停止恰好会改变看起来发生的顺序?