weak 内存管理关键字引发的“血案”
2018-08-07 本文已影响16人
嗯哎嘶唠咯
问题
今天调试一个属性被莫名置为nil的问题,调试了半天,差点没气到吐血😤,最后发现原来是被设置了 weak
关键字,属性在上一个方法调用栈结束之后就被置为nil
了。
回来通过一个测试demo进一步学习weak
关键字系统是如何处理的。
测试代码:
@interface ViewController ()
@property (weak, nonatomic) NSObject *testObject;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.testObject = [NSObject new];
}
在代码执行到第20行时,设置了一个观察断点用来观察实例变量_testObject
,值发生改变就会触发观察断点。
截图:
进行属性赋值操作时:
可以看到,底层通过调用
objc_storeWeak
设置weak
指针指向实例。
函数结束时:
在
objc_object::sidetable_release(bool)
中会对引用计数进行处理,weak_clear_no_lock
中将weak
指针做置nil
操作。
小结
通过这次调试,来反思自己处理问题的方式方法是否可以更加快速更加高效,虽然是很简单的一个问题,但用到的调试方法可以更快的定位问题,涉及的底层知识也有待去深究。