Skip to content

Objc Property

Deepin edited this page Sep 13, 2021 · 2 revisions

要了解Objective-C(以下简称OC)中的修饰符,建议先搞清楚OC中的数据结构,可以参考这篇文章Objc-DataStructure

OC中的主要属性修饰符包含:

  1. copy
  2. assign
  3. retain
  4. strong
  5. weak
  6. readwrite
  7. readonly
  8. nonatomic
  9. atomic

其中在MRC模式中使用的是assign和retain,在ARC中使用的是assign、strong和weak

属性修饰符详述

1、copy

copy属性的目的就是为了改变副本而不去影响源对象

要理解copy属性,首先需要理解深拷贝与浅拷贝:

深拷贝就是把内容拷贝一份产生一份新的对象,新对象计数器为1,源对象计数器不变 浅拷贝是指针拷贝,把地址给你,你和我指向同一个对象,源对象计数器加一,源对象和副本的计数器相同。 拷贝函数有copy和mutablecopy,调用copy时,不管是NSString、NSDictionary、NSArray、NSMutableString、NSMutableDictionary,或是NSMutableArray,都是copy出来是不可变的副本。

当调用mutablecopy产生的都是可变的副本。可变对象和不可变对象进行mutablecopy都是产生了一个新的对象,计数器为1,原来的对象计数器不变。而如果是copy而且是不可变对象进行copy的话则是浅拷贝没有产生一个新的对象相当于retain操作了,因为OC设置copy语法本身就是为了改变副本而不去影响源对象,所以为了性能着想既然copy出来的都不可变了,自然也就不会产生一个新的对象了。

可变对象进行copy就是深拷贝因为可变对象变成了不可变对象了,结构上发生了改变。总结来说就是只有不可变对象调用copy为浅拷贝其他都是深拷贝。

以上关于深拷贝和浅拷贝内容参考MooAiFighting。

2、assign

一般用来修饰基础数据类型(NSInteger, CGFloat) 和 C数据类型(int ,float, double)等。它的setter方法直接赋值,不进行任何retain操作。

3、 retain

一般在MRC模式下使用,被retain修饰的对象,引用计数retainCount要加1的。retain只能修饰oc对象,不能修饰非oc对象。 需注意:容易出现循环引用,导致内存泄露问题。

4、 strong

strong表示对对象的强引用,一般在ARC模式下使用,相当于retain 注意:两个对象之间相互强引用造成循环引用,内存泄漏。

5、 weak

weak表示对对象的弱引用,一般在ARC模式下使用,被weak修饰的对象随时可被系统销毁和回收,用weak修饰弱引用,不会使传入对象的引用计数加1,weak比较常用的地方就是delegate属性的设置。

assign和weak的区别:当它们指向的对象释放以后,weak会被自动设置为nil,而assign不会,所以会导致野指针的出现,可能会导致crash。

strong和weak的区别:strong 表明是一个强引用,相当于MRC下的retain,只要被strong引用的对象就不会被销毁,当所有的强引用消除时,对象的引用计数为0时,对象才会被销毁。 weak 表明是一个弱引用,相当于MRC下的assign,不会使对象的引用计数+1。

6、 readwrite和readonly

当我们用readwrite修饰的时候表示该属性可读可改,用readonly修饰的时候表示这个属性只可以读取,不可以修改,一般常用在我们不希望外界改变只希望外界读取这种情况。系统默认的情况就是 readwrite。

7、 nonatomic和atomic

nonatomic 非原子属性。它的特点是多线程并发访问性能高,但是访问不安全;与之相对的就是atomic,特点就是安全但是是以耗费系统资源为代价,所以一般在工程开发中用nonatomic的时候比较多。系统默认的是atomic,为setter方法加锁,而nonatomic 不为setter方法加锁。

参考链接:https://www.jianshu.com/p/c92403db1861

Clone this wiki locally