runtime 如何实现 weak 属性

weak策略表明该属性定义了一种“非拥有关系” (nonowning relationship)。为这种属性设置新值时,设置方法既不保留新值,也不释放旧值。此特质同assign类似;然而在属性所指的对象遭到摧毁时,属性值也会清空(nil out)

那么runtime如何实现weak变量的自动置nil

runtime对注册的类,会进行布局,会将 weak 对象放入一个 hash 表中。用 weak 指向的对象内存地址作为 key,当此对象的引用计数为0的时候会调用对象的 dealloc 方法,假设 weak 指向的对象内存地址是a,那么就会以a为key,在这个 weak hash 表中搜索,找到所有以a为key的 weak 对象,从而设置为 nil

在ARC环境无论是强指针还是弱指针都无需在 dealloc 设置为 nil , ARC 会自动帮我们处理即便是编译器不帮我们做这些,weak也不需要在dealloc中置nil在属性所指的对象遭到摧毁时,属性值也会清空

objc模拟下weaksetter方法,大致如下

- (void)setObject:(NSObject *)object
{
    objc_setAssociatedObject(self, "object", object, OBJC_ASSOCIATION_ASSIGN);
    [object cyl_runAtDealloc:^{ _object = nil; }];
}

 

posted @ 2017-03-01 13:33  tiankongzhicheng  阅读(418)  评论(0编辑  收藏  举报