前言
我们都知道在 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 方法触发时背后的逻辑很感兴趣。