weak属性的特点:weak表明该属性定义了一种非拥有关系,为weak属性设置新值时,设置方法既不保留新值,也不释放旧值,同assign类似,然而在属性所指的对象释放的时候,属性值也会被清空
runtime是如何实现weak变量的的自动置nil?
weak对象会被放到一个hash表中,用weak指向的对象的内存地址作为key,当此对象的引用计数为0的时候会dealloc,假如weak指向的对象内存地址是addr,那么就会以addr为健,在这个weak表中搜索,找到所有以addr为健的weak对象,从而设置为nil
runtime对注册的类会进行布局,对于weak修饰的对象会放入到一个hash表中,用weak指向的对象内存地址作为key,当此对象的引用计数为0的时候会dealloc,假如weak指向的对象的内存地址是a,那么久会以a为健仔这个weak表中搜索,找到多有以a为健的对象,从而设置为nil
NSString*name = [[NSStringalloc] initWithString: @"Jiaming Chen"];
__weakNSString*weakStr = name;
当为weakStr这一weak类型的对象赋值时,编译器会根据name的地址为key去查找weak哈希表,该表项的值为一个数组,将weakStr对象的地址加入到数组中,当name变量超出变量作用域或引用计数为0时,会执行dealloc函数,在执行该函数时,编译器会以name变量的地址去查找weak哈希表的值,并将数组里所有weak对象全部赋值为nil。
网友评论