iOS开发中的属性修饰符基本上每天都会用到,那么在iOS能够用来修饰属性的修饰符都有哪些呢?我们姑且把这些修饰符分为4种。
- 自定义方法名修饰符;
- 读写性修饰符;
- 原子性修饰符;
- 赋值性修饰符;
自定义方法名修饰符
自定义方法名修饰符通常有两种,getter和setter,使用了之后就不会使用系统自动生成的getter和setter方法了,我们都知道一般使用self.xxx
时其实是调用[self.xxx getter]的方法,setter也是一样。
这个修饰符一般用的比较少,通常用在BOOL类型中的时候,会重新设置getter方法。
|
|
读写性修饰符
读写性修饰符也有两种,readonly和readwrite,从名字就看出来一个是只读状态,另一个是读写状态,一般用于防止外部类修改内部变量,可以在.h
文件中使用readonly修饰符,在.m
文件中使用readwrite修饰,这样外部就只能读取而不能修改变量了。
readonly
表示只读属性,只会自动生成getter方法,不会生成setter方法。
readwrite
表示读写属性,会生成getter和setter方法。
原子性修饰符
原子性修饰符有nonatomic和atomic两种。
nonatomic
nonatomic表示非原子性,不为setter方法加锁,是非线程安全的。
atomic
atomic表示原子性,是iOS默认的状态,会为setter方法加锁,线程安全(不是绝对的),但是会消耗大量资源。
赋值性修饰符
赋值性修饰符有weak、strong、retain、assign、copy。
weak
weak表示弱引用,在ARC中使用,如果指向的对象被释放了,会指向nil,可以有效避免野指针的问题,引用计数为1。
weak一般比较常用在delegate中等一些有可能会因为循环引用而照成内存泄漏的地方。
strong
strong表示强引用,在ARC中使用,用于指针变量,在setter方法中对参数进行release旧值之后再retain新值。
使用strong时需要注意避免两个strong对象之间互相引用造成内存泄漏。
retain
retain和strong很相似,表示强引用,一般在MRC中使用,retain只能修饰OC对象,比如NSObject,不能修饰非OC对象,比如int。使用retain引用计数+1。
assign
assign和weak比较相似,在ARC和MRC中都可以使用,一般用来修饰基础数据类型,比如NSIntegter,CGFloat等,使用assign不会增加引用计数。它的setter方法是直接赋值。
copy
copy表示拷贝特性,一般用于NSString、NSArray等拥有可变类型的不可变对象,也可以用来修饰block,在MRC和ARC下都可以使用,他的setter方法会先release旧值,再copy新的对象。
赋值修饰符中的比较
weak vs assign
weak在指向的对象被释放后,会自动指向nil,
assign在指向的对象被释放后,不会自动指向nil,导致出现野指针
在OC中,向nil发出消息时是不会有事情发生的,但是像野指针发出消息则会导致出错。
weak vs strong
weak表示弱引用,不会持有对象,
strong表示强引用,会持有对象,
当两个对象互相strong引用时,会发生循环应用,导致内存泄漏,这时候如果有一方变为weak,就可以防止这种问题的发生。
strong vs retain
strong通常使用在ARC环境下,
reatin通常使用在MRC环境下。
strong vs copy
通常在修饰NSString时,可能会出现两者比较的情况,具体可以看iOS开发-iOS中的拷贝
最后
这些大概就是iOS中修饰符的全部内容,本文章仅限个人学习使用,如果有什么不对的地方还希望大佬帮忙批评指正。