1.weak是弱引用,引用对象的计数器不会加1
2.通常用于解决循环引用的关系,代理和block用的较多
3.初始化——会调用objc_initWeak()函数,初始化一个新的weak指针指向对象的地址。
4.添加引用——会调用objc_storeWeak()函数,更新指针指向,创建对应的弱引用表。
5.释放——会调用clearDeallocating函数,根据对象地址遍历weak指针地址数组,将其设置为nil。
6.(weak和strong)不同的是 当一个对象不再有strong类型的指针指向它的时候 它会被释放,即使还有weak型指针指向它。
7.weak和assign的区别是:weak当指向的内存释放掉后自动nil化,防止野指针
8.循环引用的问题
Student *student = [[Student alloc]init];
__block Student *stu = student;
student.name = @"Hello World";
student.study = ^{
NSLog(@"my name is = %@",stu.name);
stu = nil;
};
说明:现在student持有该block,block持有__block变量,__block变量又持有student对象。
3者形成了环,导致了循环引用了,__block修辞student即可。