MRR中:
例:
@property(nonatomic ,retain,readwrite)NSString *userName;
括号中的参数:
第一个:原子性:1、atomic:多线程环境下,存在线程保护,默认
2、nonatomic:多线程环境下,不存在线程保护。
第二个:语义:1、assign:直接赋值、默认
2、retain:保留对象
3、copy:拷贝对象
第三个:读写性:1、readwrite:生成getter、setter方法,默认。
2、readonly:只生成getter方法。
还可以有非空性:1、nullable:属性可以为空,默认。
2、nonull:属性不能为空。
3、null_resettable:有默认值,如果传入nil,则将属性修改为默认值
循环引入的问题:你调用我,我调用你。
解决方法:让其中一个使用assign,不用retain。
ARC中:
__strong关键字的使用:(相当于MRR中的retain)
1、__strong关键字,用于修饰指向对象的变量,也称作:强引用。
2、__strong告诉编译器需要对比对象retain一次。
3、指向对象的指针变量,默认就是__strong修饰的
__weak关键字的使用:(相当于MRR中的assign)
1、__weak和__strong同样用于修饰变量,weak修饰的对象,此对象不会被retain。
2、__weak修饰的变量,如果此变量指向的对象销毁了,那么weak会自动将此变量设置为nil,以避免产生野指针调用。
weak可以防止循环引用。
@property的修饰符总结:
1、strong相当于非ARC(MRR)中的retain;
2、weak相当于非ARC(MRR)中的assign;
3、copy和之前的copy一样,复制一个对象,并创建strong关联;
4、assign:对象不能使用assign,基本数据类型可以使用。
记: NSString不需要内存管理
NSString用copy
一般对象用strong
基本数据类型用assign
weak用于UI控件、协议代理者