iOS进阶之@property属性关键字

nonatomic和atomic区别

在默认情况下,由编译器所合成的方法(setter 和 getter)会通过锁定机制来确保其原子性。系统默认使用的是atomic这个属性,这个属性会为setter 和 getter 方法进行加锁来确保线程安全的(有可能会出现多条线程来同时访问这一个数据)。

atomic 原子性 线程安全的系统会默认给atomic修饰的属性的setter和getter方法进行加锁。

nonatomic 非原子性 线程不安全的系统不会给atomic修饰的属性的setter和getter方法进行加锁。

注意:虽然atomic是线程安全的但我们平时用到的大多数属性都是用nonatoic来修饰的,因为atomic虽然是线程安全的,但系统会默认给atomic修饰的属性加锁,而加锁会影响系统的性能,我们一般使用的还是nonatomic,在开发过程中应尽量避免多条线程来访问同一个属性。如果我们不写这2个关键字中的任何一个,则系统默认生存的是atmoic。

readwrite

用readwrite修饰的属性系统会自动生存setter和getter方法

readonly

应readonly修饰的属性系统不会生存setter方法只会生成getter方法

assign

一般用来修饰基本数据类型只进行简单的赋值操作比如int float double CGFloat

strong

强引用,一般用来修饰对象,该关键字修饰的属性在设置新值时,设置方法会先保留新值,并释放旧值,然后再讲新值设置上去。

weak

弱引用,一般用来修饰对象,该关键字修饰的属性在设置新值时,设置方法既不先=保留新值,并=也不释放旧值,此特性和assign类似,然而在属性所指定的对象遭到释放时,属性值也会清空nil

unsafe_unretained

此特质的语义和assign形态,但它适用于对象类型,然而在属性所指定的对象遭到释放时,此属性值不会清空nil,有可能会造成野指针错误。

copy

此关键字和strong类型,然而设置方法并不保留新值,而是将其copy。当属性类型为NSString *时,经常使用此特别来保护其封装性,因为传递给设置方法的新值有可能是一个NSMutableString 类的实例。这个类是NSString的之类,表示一种可以修改的字符串,此时若不拷贝字符串,那么设定万属性之后,字符串的值就有可能会在对象不知情的情况下遭人修改。所以就要拷贝一份不可变的字符串,来确保对象中的字符串值不会无意间变动。

你可能感兴趣的:(iOS进阶之@property属性关键字)