属性关键字可以分为三种类型:
1.读写权限的类型: readonly ,readwrite
2.原子类 : atomic ,nonatomic
3.引用计数 : retain/strong/copy,assign/unsafe_unretained,weak
读写权限的类型: readonly ,readwrite
readwrite 是可读可写特性;会自动生成getter方法和setter方法
readonly 是只读特性 只会生成getter方法 ,不会生成setter方法
原子类: atomic nonatomic
atomic是保证赋值和获取是线程安全的。 这里说的是对成员属性的直接赋值和获取,并代表操作和访问。 对于atomic的属性,系统生成的 getter/setter 会保证 get、set 操作的完整性,不受其他线程影响。atomic对一个数组,进行赋值或获取,是可以保证线程安全的。但是如果数组进行操作,比如给数据加对象或移除对象,是不在atomic的保证范围。
引用计数
retain/strong:修饰objc数据类型,其引用计数+1,修饰的对象被释放后,引用计数-1
assign:修饰基本数据类型,修饰对象类型时,不改变其引用计数,会产生悬垂指针,修饰的对象在被释放后,assign指针仍然指向原对象内存地址,如果使用assign指针继续访问原对象的话,就可能会导致内存泄漏或程序异常
weak:不改变被修饰对象的引用计数,所指对象在被释放后,weak指针会自动置为nil
copy:分为深拷贝和浅拷贝
浅拷贝:对内存地址的复制,让目标对象指针和原对象指向同一片内存空间会增加引用计数
深拷贝:对对象内容的复制,开辟新的内存空间
注:可变对象的copy和mutableCopy都是深拷贝;不可变对象的copy是浅拷贝,mutableCopy是深拷贝;copy方法返回的都是不可变对象。
下面我们来说一说面试会被问到的知识点:
Q:@property (nonatomic, copy) NSMutableArray * array;这样写有什么影响?
A:copy方法返回的都是不可变对象,所以array对象实际上是不可变的,如果对其进行可变操作如添加移除对象,则会造成程序crash
Q:strong和weak的区别?
A:strong 表示指向并拥有该对象。其修饰的对象引用计数会加1.该对象只要引用计数不为0则不会被销毁。当然强制将其置为nil也可以销毁它。 weak 表示指向但不拥有该对象。其修饰的对象引用计数不会增加。无需手动设置,该对象会自行在内存中销毁。
Q:assign 和weak的区别?
A:1、assign可以修饰对象和基本数据类型, weak只修饰对象
2、assign 所修饰的对象被释放后,还会指向原对象内存地址。weak 所修饰的对象被废弃之后,weak 所修饰对象会被设置为nil。
Q:浅拷贝和深拷贝的区别?
A:浅拷贝增加引用计数,不产生新的内存。 深拷贝不增加引用结束,会新分配内存