iOS开发-iOS中的修饰符

iOS开发中的属性修饰符基本上每天都会用到,那么在iOS能够用来修饰属性的修饰符都有哪些呢?我们姑且把这些修饰符分为4种。

  • 自定义方法名修饰符;
  • 读写性修饰符;
  • 原子性修饰符;
  • 赋值性修饰符;

自定义方法名修饰符

自定义方法名修饰符通常有两种,getter和setter,使用了之后就不会使用系统自动生成的getter和setter方法了,我们都知道一般使用self.xxx时其实是调用[self.xxx getter]的方法,setter也是一样。

这个修饰符一般用的比较少,通常用在BOOL类型中的时候,会重新设置getter方法。

1
@property (nonatomic ,assign , getter = isOK ,setter = setIsOK:) BOOL ok;

读写性修饰符

读写性修饰符也有两种,readonlyreadwrite,从名字就看出来一个是只读状态,另一个是读写状态,一般用于防止外部类修改内部变量,可以在.h文件中使用readonly修饰符,在.m文件中使用readwrite修饰,这样外部就只能读取而不能修改变量了。

readonly

表示只读属性,只会自动生成getter方法,不会生成setter方法。

readwrite

表示读写属性,会生成getter和setter方法。

原子性修饰符

原子性修饰符有nonatomicatomic两种。

nonatomic

nonatomic表示非原子性,不为setter方法加锁,是非线程安全的。

atomic

atomic表示原子性,是iOS默认的状态,会为setter方法加锁,线程安全(不是绝对的),但是会消耗大量资源。

赋值性修饰符

赋值性修饰符有weakstrongretainassigncopy

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中修饰符的全部内容,本文章仅限个人学习使用,如果有什么不对的地方还希望大佬帮忙批评指正。