04perproty几个修饰词

属性readwrite、readonly、assign、weak strong、retain、copy、nonatomic各是什么作用,在哪种情况下用?
参考答案:

作用分别是:

readwrite:代表可读可写,会生成getter和setter方法
readonly:代表只读,只生成getter方法,不会生成setter方法
assign:代表普通赋值,通常用于非对象类型,MRC下对于弱引用也使用assign,ARC下弱引用通常使用weak
retain:MRC下才能手动使用,与ARC下的strong一样,指定强引用,引用计数加1
copy:代表拷贝,也是强引用,引用计数加1,进行指针拷贝
nonatomic:代表非原子操作,非线程安全,但可提高性能,通常声明属性时都会添加
在哪种情况使用:

readwrite:默认就是,通过不用显示指定,需要生成setter和getter时使用
readonly:当不希望生成setter时使用
assign:通常是非对象类型使用
retain:MRC下才能使用,表示对象强引用
copy:生成不可变对象、需要拷贝时使用
nonatomic:不要求线程安全时使用,可提高性能,通常都会使用

什么情况使用 weak 关键字?

在 ARC 中,在有可能出现循环引用的时候,往往要通过让其中一端使用 weak 来解决,比如: delegate 代理属性

自身已经对它进行一次强引用,没有必要再强引用一次,此时也会使用 weak,自定义 IBOutlet 控件属性一般也使用 weak;当然,也可以使用strong。在下文也有论述:

不同点:

weak 此特质表明该属性定义了一种“非拥有关系” (nonowning relationship)。为这种属性设置新值时,设置方法既不保留新值,也不释放旧值。此特质同assign类似,然而在属性所指的对象遭到摧毁时,属性值也会清空(nil out)。而 assign 的“设置方法”只会执行针对“纯量类型” (scalar type,例如 CGFloat 或 NSlnteger 等)的简单赋值操作。

assigin 可以用非 OC 对象,而 weak 必须用于 OC 对象
首先明白什么情况使用 weak 关键字? 在 ARC 中,在有可能出现循环引用的时候,往往要通过让其中一端使用 weak 来解决, 比如:delegate 代理属性,代理属性也可使用 assign 自身已经对它进行一次强引用,没有必要再强引用一次,此时也会使用 weak,自定义 IBOutlet 控件属性一般也使用 weak;当然,也可以使用 strong,但是建议使用 weak weak 和 assign 的不同点 weak 策略在属性所指的对象遭到摧毁时,系统会将 weak 修饰的属性对象的指针指 向 nil,在 OC 给 nil 发消息是不会有什么问题的;如果使用 assign 策略在属性所指 的对象遭到摧毁时,属性对象指针还指向原来的对象,由于对象已经被销毁,这时 候就产生了野指针,如果这时候在给此对象发送消息,很容造成程序奔溃 assigin 可以用于修饰非 OC 对象,而 weak 必须用于 OC 对象

你可能感兴趣的:(04perproty几个修饰词)