原子性
atomic (原子性)(系统默认): 使用同步锁。能够保证赋值和获取是线程安全的。但不能保证操作和访问是线程安全的。
nonatomic (非原子性): 不适用同步锁。
在 iOS 开发中一般使用 nonatomic
,因为在 iOS 中使用同步锁的开销较大,可能会带来性能问题,而且使用atomic不能保证线程安全。
读写权限
readwrite (读写)(系统默认):可读可写,属性拥有 getter
与setter
方法,如果该属性由 @synthesize
实现,编译器会自动生成getter
与setter
方法。
readonly (只读):只能读取,不能写入,属性仅拥有 getter
方法。
内存管理语义
assign:“设置方法”,只会执行针对基本数据类型的赋值操作。
1)assign修饰基本数据类型
2)修饰对象类型时不改变其引用计数
3)assign 修饰的对象在被释放之后,assign指针仍然指向原对象地址,会产生悬垂指针
strong:表明属性定义了一种“拥有关系”,为这种属性设置新值时,设置方法会先保留新值,释放旧值,然后再将新值赋值上去。
copy:表明属性定义了一种“拥有关系”,为这种属性设置新值时,设置方法不会保留新值,而是将新值拷贝一份。
当属性类型为 NSString
(NSArray
, NSDictionary
) 时,经常使用copy
的特性保护其封装性。因为传递给设置方法的新值可能是指向一个 NSMutableString
类的实例,它表示是一个可修改的字符串,如果不拷贝字符串,那么在属性设置完之后,字符串的值可能在对象不知情的情况下遭到修改。所以此时就要 copy 一份不可变的字符串,确保属性设置完新值后不会被无意间改动。
1) 可变对象的copy和mutableCopy都是深拷贝
2) 不可变对象的copy都是浅拷贝,mutableCopy是深拷贝
3)mutableCopy返回的都是可变对象,copy返回都为不可变
weak:表明属性定义了一种“非拥用有关系”,为这种属性设置新值时,设置方法既不保留新值,也不会释放旧值。在属性所指对象遭到销毁时,属性值会清空(即被赋值为nil)。
1)不改变被修饰对象的引用计数
2)所指对象在被释放之后会自动置为nil
unsafe_inretained:(语义与 assign
相同,它适用于对象类型)表明属性定义了一种“非拥有关系”,只会执行对对象类型的赋值操作。当目标对象遭到摧毁时,属性值不会自动清空。
方法名
getter=<name>:指定获取方法的方法名。
setter=<name>:指定设置方法的方法名。
查阅资料《 Effective Objective-C 2.0 编写高质量 iOS 和 OS X 代码的52个有效方法》
网友评论