在iOS中属性用于封装数据,自动生成get和set方法。面试中经常会被问到assign、strong、weak、copy、unsafe_unretained、retain区别, 在<<Effective Objective-C 2.0>>中有详细的介绍。
- assign 修饰纯数据类型的简单赋值,如CGFloat或Int。
- strong 表明属性定义了一种拥有关系,为这种属性设置新值时,先保留新值,并释放旧值,然后在将新值设置上去,计数加1。
- weak 表明属性定义了一种非拥有关系,为这种属性设置新值时,设置方法既不保留新值,也不释放旧值。在属性所值的对象遭到摧毁时,属性值也清空。
- copy 与strong类似,但是设置方法并不保留新值,而是将其拷贝。
- ** retain** ARC下strong等同于MRC下的retain,都是计数加1。
- ** unsafe_unretained** 于assign差不多,但是它适用于对象类型,表明非拥有关系,当目标对象遭到摧毁的时候,属性值不会自动清空,这一点与weak有区别。
- ** atomic** 设置成员变量的@property属性时,默认为atomic,提供多线程安全。在多线程环境下,原子操作是必要的,否则有可能引起错误的结果。加了atomic,setter函数会变成下面这样:
{lock}
if (property != newValue)
{
[property release];
property = [newValue retain];
}
{unlock}
- nonatomic 非原子性,禁止多线程,变量保护,提高性能。
注意:atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,所以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择。
-
readwrite 申明属性可读可写,拥有set方法和get方法。
-
readonly 只读属性,只能获取属性值,不能写属性值。
-
getter=name指定属性值获取方法名。如
@property (nonatomic, getter = isOn) BOOL on;
- setter=name指定设置方法名,这种用法不太常见。
在iOS内存管理中时刻默念计数式内存管理的思考方法:
自己生成的对象,自己持有。
非自己生成的对象,自己也能持有。
不再需要自己持有的对象时释放。
非自己持有的对象无法释放。
网友评论