美文网首页
weak 内存管理关键字引发的“血案”

weak 内存管理关键字引发的“血案”

作者: 嗯哎嘶唠咯 | 来源:发表于2018-08-07 23:14 被阅读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操作。

    小结

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

    相关文章

      网友评论

          本文标题:weak 内存管理关键字引发的“血案”

          本文链接:https://www.haomeiwen.com/subject/yhuzvftx.html