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操作。

小结

通过这次调试,来反思自己处理问题的方式方法是否可以更加快速更加高效,虽然是很简单的一个问题,但用到的调试方法可以更快的定位问题,涉及的底层知识也有待去深究。

上一篇下一篇

猜你喜欢

热点阅读