-
读写属性:
- setter:指定生成setter方法的名字。
- getter:指定生成getter方法的名字,例如
@property (nonatomic, assign, getter=isHidden) Bool hidden
。 - readwrite:产生setter和getter方法。
- readonly:只产生getter方法,并不能保证完全只读,可以通过kvc进行修改赋值。
当在持有该属性所在的类中,加上如下函数时,
+ (BOOL)accessInstanceVariablesDirectly {
return NO;
}
就无法对readonly修饰的属性修改了,具体原因打开苹果的官方文档找到Key-Value Coding Programming Guide
可以看出,如果该函数返回YES,将直接调用valueForUndefinedKey方法。
-
Setter语义:
- retain:setter方法对参数进行release旧值,再retain新值。
- strong:默认修饰词,强引用,默认所有实例变量和局部变量都是strong指针,如果一个对象被强引用所持有,那么该对象就不会被释放。
- weak:弱引用,即使一个对象被持有无数个弱引用,只要没有强引用指向它,那其还是会被清除,它不是对象的拥有者,其值会在对象被释放后自动设置为nil。 weak指针主要用于“父-子”关系,父亲拥有一个儿子的strong指针,因此父亲是儿子的所有者,但为了阻止所有权循环,儿子需要使用weak指针指向父亲。
- assign:setter方法直接赋值,而不进行retain操作,适用于基本数据类型,对象类型,不会发生引用计数变化。
- copy:setter方法进行copy操作,与retain一样
-
读写属性:
- atomic:默认的属性修饰词,按官方文档上的说明,可以在不同线程调用setter和getter,但是atomic并不是线程安全的,因为atomic只能保证通过setter和getter方法能获取到一个完整的值,但是如果A线程调用setter,B、C线程调用getter,可能B、C读取的是A设置之后的值,也可能B先读了,A在设置,之后C又读了。
- nonatomic:通过nonatomic修饰的属性,并没有做锁的操作,多线程同时进行setter和getter操作,并不能保证得到一个完整的值,所以相对atomic来说nonatomic修饰的属性访问速度更快,而且平时对线程安全我们更倾向于使用信号量和锁的方式去控制线程安全,他们都能保证代码块的原子性,所以几乎所有的属性都用nonatomic去修饰。
-
空值:
- nullable:表示对象可以是NULL或nil。
- nonnull: 表示对象不应该为空。
网友评论