前言
我们都知道在 ARC 环境无论是强指针还是弱指针都无需在 dealloc
设置为 nil
, ARC 会自动帮我们处理。然而,最近在项目中遇到这样一个问题,代码示例如下:
|
|
其中,_obj
是类 Foo
的 weak 属性,这段代码所做的工作是在 Foo
的实例对象销毁的时候,移除 _obj
对象上的观察者,否则,会导致 KVO still registering when deallocated
的 crash 。原以为这样写会 work ,然而在实际测试中发现,在触发 dealloc
方法时,_obj
此时已被置为 nil
,即 [_obj removeObserver:[KVOObserverStub stub] forKeyPath:_keyPath];
并不会触发。解决方案则是将 _obj
属性的修饰符由 weak
改为 unsafe_unretained
或者 assign
。但是,这样改可能会为其他代码引入 bug ,因为现在 ARC 不会自动为将 _obj
对象置为 nil
,需要去检查涉及 _obj
部分的代码。虽然这样解决问题了,但是,我还是对 weak
属性在其持有对象的 dealloc
方法触发时背后的逻辑很感兴趣。