ARC下默认的基本类型
@property (atomic, readwrite, assign)
ARC下默认的对象类型
@property (atomic, readwrite, strong)
1、原子性修饰符 atomic、nonatomic
atomic:线程安全 nonatomic:非线程安全,使用该属性性能会有所提高,一般都使用该属性
2、读写属性修饰符 readwrite、readonly
readwrite:读写操作,系统默认设置getter和setter方法,可以修改
readonly:只读操作,系统只是设置getter方法,只能获取不能修改
3、setter相关修饰符 assign、retain、copy
assign:表示直接赋值,用于基本的数据类型如:NSIntegar、CGFloat。C的数据类型如:float、int、char等。还有id类型
retain:针对对象类型进行内存管理,修饰对象,实现过程(setter方法会先将旧的属性release掉,然后再对新的对象进行一次赋值,并进行一次retain)引用计数会加1
copy:主要修饰NSString类型,表示内容的复制
【当某对象的类具有可修改的子类时,应该将属性设为copy。例如:NSString,NSArray,NSDictionary】
这样做的原因是:如果属性指向的对象的类具有可修改的子类,那个该属性可能会指向可修改的子类对象,同时该子类对象可能会被其他拥有者修改。因此,最好先复制该对象,然后再将属性指向复制后的对象。(编写具有“防御性”的代码)
关于@property后面修饰符的一些问题
1、@property (nonatomic,copy) NSMutableArray *array; 这段代码会有什么问题?
添加,删除,修改数组内的元素的时候,程序会因为找不到对应的方法(unrecognised selector)而崩溃.因为 copy 就是复制一个不可变 NSArray的对象。
应如何修改?
@property (nonatomic,MUtableCopy) NSMutableArray *array;
2、assign与weak,它们都是弱引用声明类型,最大的区别在那呢?
如果用weak声明的变量在栈中就会自动清空,赋值为nil。
如果用assign声明的变量在栈中可能不会自动赋值为nil,就会造成野指针错误!
3、用@property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?
1).因为父类指针可以指向子类对象,使用 copy 的目的是为了让本对象的属性不受外界影响,使用 copy 无论给我传入是一个可变对象还是不可对象,我本身持有的就是一个不可变的副本.
2).如果我们使用是 strong ,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性.
copy 此特质所表达的所属关系与 strong 类似。然而设置方法并不保留新值,而是将其“拷贝” (copy)。 当属性类型为 NSString 时,经常用此特质来保护其封装性,因为传递给设置方法的新值有可能指向一个 NSMutableString 类的实例。这个类是 NSString 的子类,表示一种可修改其值的字符串,此时若是不拷贝字符串,那么设置完属性之后,字符串的值就可能会在对象不知情的情况下遭人更改。所以,这时就要拷贝一份“不可变” (immutable)的字符串,确保对象中的字符串值不会无意间变动。只要实现属性所用的对象是“可变的” (mutable),就应该在设置新属性值时拷贝一份。