1.strong:强指针/强引用
weak:弱指针/弱引用
2.默认情况下,任何指针都是强指针
3.使用__weak修饰的指针为弱指针
4.Person *p = [[Person alloc] init];
[[Person alloc] init],系统会分配内存装这个对象,然后交给p这个指针去指着。
5.ARC判断准则:只要没有强指针指向对象,这个对象就会被销毁
6.如果指针p是局部变量,那函数完成时指针p就会被销毁,根据ARC,被指针所指
向的对象也会被销毁。
7.person对象里有个strong的dog属性。
person.dog = dog1;
这样,person里的_dog指针就会指向dog1指针所指的Dog对象。
因为是strong,所以只要person对象在,Dog对象就在。
所以普通对象要用strong。
8.循环引用:person对象里有个dog属性,dog对象里有个person属性。
Person *p = [[Person alloc] init];
p.dog = [[Dog alloc] init];
p.dog.owner = p;//加上这一句,人和狗都不能销毁。出现内存泄露
要想不发生内存泄露,其中一个指针必须是弱指针。
9.为什么UI控件和代理用weak?
UI控件:可以用strong,也可以用weak,但没必要用strong,因为只要控制器在,
控制器View内部的子控件都在。
代理:如果不用weak那么两边都是strong,会造成内存泄露。
10.总结
@property属性的用法
* weak(assign):代理/UI控件
* strong(retain):其他对象(除代理,UI控件,字符串以外的对象)
* copy:字符串
* assign:非对象类型(基本数据类型int/float/BOOL/枚举/结构体)