前言: 最近一直在思考怎么近一步提高自己的技术, 也就是大家所说的进阶, 做 iOS 也有几年的时间了, 确实到了该进阶或者该考虑如何进阶的阶段了. 一切都需要摸索, 所以记录下自己的学习状态. 希望对自己和小伙伴们有所帮助.
一. 自动引用计数
概念: 顾名思义, 指内存管理中对引用才去自动引用计数的技术. 在 OC 中采用 Automatic Reference Counting(ARC) 机制, 让编译器进行内存管理
2. 在 LLVM 编译器中设置 ARC 为有效状态, 就无需再次键入 retain 或者 release 代码.
二. 内存管理的思考方式
生成并持有对象: alloc/copy/new/mutableCopy 等方法
持有对象: return 方法
释放对象: release 方法
废弃对象: dealloc 方法
1. 自己生成的对象, 自己持有
- // alloc, new 等方法内部实现了 retain 方法, 所以使用后直接持有对象
- --> id obj = [[NSObject alloc] init];
2. 非自己生成的对象, 自己也能持有
- // 内部调用 autorelease, 使对象存在, 但不持有
- --> id obj = [NSMutableArray array];
- --> [obj retain]; // 自己持有对象
3. 不再需要自己持有的对象时释放
- --> id obj = [[NSObject alloc] init];
- --> [obj release];
4. 非自己持有的对象无法释放
- --> id obj = [NSMutableArray array]; // 生成对象存在, 但不持有
- --> [obj retain]; // 自己持有对象
- --> [obj release]; // 释放对象, 对象不可再访问
三. 引用计数
在 OC 中, 对象中存有引用计数这一整数值
调用 alloc 或者 retain 方法后, 引用计数 + 1
调用 release 后, 引用计数 - 1
引用计数为 0 时, 调用 dealloc 方法废弃对象
autorelease
自动释放, 超出作用域, 自动调用 release 方法
// 具体使用方法
1. 生成并持有 NSAutoreleasePool 对象
2. 调用已分配对象的 autorelease 实例方法
3. 废弃 NSAutoreleasePool 对象 (废弃 NSAutoreleasePool 时, 自动调用 release 方法)
四. ARC 规则
所有权修饰符
OC 中, 为了处理对象, 将变量类型定义为 id 类型或者各种对象类型
- // id 类型和对象类型默认的所有权修饰符
- // 附有__strong 的变量 obj 在超出作用域被废弃时, 会释放被赋予的对象
__strong 修饰符 (对对象的强引用)
- // 解决内存管理中必然会发生的循环引用问题
- // __weak 与__strong 相反, 提供弱引用, 弱引用不能持有对象实例
- // 在持有对象弱引用时, 若对象被废弃, 则此弱引用将自动失效, 并处于 nil 状态 (这就是为什么协议方法使用 weak 要比 assign 好的原因)
__weak 修饰符 (对对象的弱引用)
- // 不安全修饰符
- // 和__weak 基本一样, 但是对象被废弃不会自己置为 nil
__unsafe_unretained 修饰符
// ARC 模式下, 不能使用
__autoreleasing 修饰符
ARC 模式下, 不能使用 retain/release/retainCount/autorelease. 因为内存管理是编译器的工作, 因此没有必要使用内存管理方法 (retain/release/retainCount/autorelease). 官方文档说明
id 型或者对象型赋值给 void * 或者逆向赋值需要特定转换, 如果想单纯的赋值, 可以使用 "__bridge" 转换.
五. 属性
当 ARC 模式下, OC 属性会发生变化
@property (nonatomic, strong) NSString *name;
属性声明的属性与所有权修饰符的对应关系
- assign = __unsafe_unretained
- copy = __strong (但是赋值的是被复制的对象)
- retain = __strong
- strong = __strong
- unsafe_unretained = __unsafe_unretained
- weak = __weak
参考书籍Objective-C 高级编程 iOS 与 OS X 多线程和内存管理
觉得有帮助的小伙伴, 可以动动勤劳的小手点个喜欢或者关注哦~
你们的支持对我来说很重要!
来源: http://www.jianshu.com/p/27cb71f777cf