在《Objective-C 高级编程:iOS 与 OS X 多线程和内存管理》一书中,对于 ARC 的部分有详尽的讲解。我将这一部分整理成思维导图,算是一个归档吧。
如下是一些需要注意的点:
- id
是 OC 中对象标识的数据类型,可以用来指定任何类。
- id
是所有对象的终极超类。
- id
中
- <objc/objc.h>
的定义:
- id
- /// Represents aninstanceof a class.
- struct objc_object {
- Class isa OBJC_ISA_AVAILABILITY;
- };
- /// A pointer to aninstanceof a class.
- typedef struct objc_object *id;
使得原本的静态类型的语言变得动态起来。这就意味着,它指向的对象的类型是不被编译器检查的。
- id
类型和对象类型同 C 语言其他类型不同,其类型上必须附加所有权修饰符,包括:
- id
,
- __strong
,
- __weak
和
- __unsafe_unretain
修饰符。
- __autoreleasing
,
- __strong
和
- __weak
修饰符一起,可以保证将附有这些修饰符的自动变量初始化为
- __autoreleasing
。
- nil
、
- __strong
、
- __weak
- __unsafe_unretain
:是
- __strong
类型和对象类型默认的所有权修饰符。附有
- id
修饰符的变量,在超出其变量作用域时,即在该变量被废弃时,会释放其被赋予的对象。表示逻辑上强持有一个对象。规则是:指针被赋值时同时进行 retain 处理;指针销毁时对指针的内容进行 release。
- __strong
:指针被赋值时,不会对所赋的对象进行 retain,意味着引用计数会随时为零,一旦为零,就会被置为
- __weak
,也就是说,要再引用计数为零之前置为
- nil
。
- nil
:不安全的不持有。规则是:声明一个指针,对赋值的对象不进行 retain,如果对象为零了,那么指针会继续指向这个对象。
- __unsafe_unretain
会有性能损耗,所以在处理极大对象的时候会使用
- __weak
属性。
- __unsafe_unretain
,
- strong
,
- weak
- assign
:和
- strong
是一样的,在 dealloc 的时候 release。
- __strong
:和
- weak
是一样的,一旦引用计数变为零,会自动置为
- __weak
。
- nil
:能够声明很多标量(float,int 等),用它来声明变量时,和
- assign
一样,声明一个指针的时候会对它进行持有,当为零的时候也不会自动释放。
- __unsafe_unretain
详解
- weak
。
- nil
:底层有一个哈希表,哈希表中存储所有 weak 指向的对象。用 weak 指针指向的值(对象的地址,是一个栈 / 堆上的变量)作为 key,所有指向它的地址作为 value。每当对象 dealloc 时,就会检查这个表,同时把表中所有指向这个对象的指针都置为 nil。
- nil
即让对象自己去清空弱引用的对象,这种特殊的弱引用被称为归零弱引用。在它指向的对象释放后,这些弱引用会被设置为零(即 nil)。
有两种方式可以声明归零弱引用:
- - 声明变量时使用__weak关键字或对属性使用weak特性。
- - 在不支持弱引用的旧系统上,可以使用苹果公司提供的__unsafe_unretained关键字和unsafe_unretained特性。
来源: http://www.tuicool.com/articles/fm6JfaE