1、@property是什么
声明属性的语法,可以快速的为实例变量创建setter和getter方法,并允许通过点语法使用
2、@property关键字使用说明
strong 赋值时,调用对象的retain方法,使其引用计数加1
weak 不增加对象的引用计数,也不持有对象,对象被释放时,自动置为nil
copy 创建一个引用计数为1的对象,通常用于修饰NSString和block
assign 修饰基本数据类型(int float double)
atomic 原子操作,提供线程安全,默认属性,耗费系统资源
nonatomic 非原子操作,不提供线程安全,效率更高
unsafe_unretained 和weak类似,引用计数为0,不会自动置为nil
readonly 只读
readwrite 读写,默认属性
3、@property关键字之间的区别
strong和retain的区别:strong和retain都是强引用,大部分情况是可以通用的
在修饰block属性时,通常情况下用copy,如果不用copy,block是存放在栈里面的,它的生命周期会随着函数的结束而出栈的,copy之后会存放在堆里面。strong在修饰block的时候相当于copy,而retain修饰block时相当于assign,这样block会出现被提前释放掉的危险。
copy关键字的使用:
浅拷贝:指针的拷贝,不会产生新的对象,源对象的引用计数加1
深拷贝:对象的拷贝,创建新的对象,源对象的引用计数不变
copy无论修饰不可变对象还是可变对象,copy的结果都是不可变的类型
mutableCopy无论的对象时不可变的还是可变的,拷贝之后的数据类型都是可变的类型
copy对引用计数的影响:
拷贝一个不可变的对象结果是新对象和源对象指向同一个内存地址,即指针的拷贝,属于浅拷贝
拷贝一个可变的对象,会生成一个新对象,不影响源对象的引用计数
mutableCopy对引用计数的影响:
无论对可变类型或对不可变类型使用mutableCopy,都不会影响对象的引用计数