ARC基本概念
本小节知识点:
- 【掌握】什么是ARC
- 【掌握】ARC的注意点和优点
3. 【掌握】ARC的判断原则
1.什么是ARC
-
Automatic Reference Counting,自动引用计数,即ARC,可以说是WWDC2011和iOS5所引入 的最大的变革和最激动人心的变化。ARC是新的LLVM 3.0编译器的一项特性,使用ARC,可以说一 举解决了广大iOS开发者所憎恨的手动内存管理的麻烦。
- >手动管理内存, 可以简称MRC (Manual Reference Counting)
-
在工程中使用ARC非常简单:只需要像往常那样编写代码,只不过永远不写
retain,release和autorelease
三个关键字就好~这是ARC的基本原则。 -
当ARC开启时,编译器将自动在代码合适的地方插入retain, release和autorelease,而作为程序猿,完全不需要担心编译器会做错(除非开发者自己错用ARC了)。
2.ARC的注意点和优点
-
ARC的注意点
- ARC是编译器特性,而不是运行时特性
- ARC不是其它语言中的垃圾回收, 有着本质区别
-
ARC的优点
- 完全消除了手动管理内存的烦琐, 让程序猿更加专注于app的业务
- 基本上能够避免内存泄露
- 有时还能更加快速,因为编译器还可以执行某些优化
3.ARC的判断原则
-
ARC的判断原则
- 只要还有一个强指针变量指向对象,对象就会保持在内存中
-
强指针
- 默认所有指针变量都是强指针
- 被__strong修饰的指针
Person *p1 = [[Person alloc] init];
__strong Person *p2 = [[Person alloc] init];
- 弱指针
- 被__weak修饰的指针
__weak Person *p = [[Person alloc] init];
- > 注意:当使用ARC的时候,暂时忘记“引用计数器”,因为判断标准变了。
ARC快速入门
本小节知识点:
- 【了解】ARC机制判断
- 【了解】ARC快速使用
1.ARC机制判断
- OS5以后,创建项目默认的都是ARC
- ARC机制下有几个明显的标志:
- 不允许调用对象的 release方法
- 不允许调用 autorelease方法
- 再重写父类的dealloc方法时,不能再调用 [super dealloc];
2.ARC快速使用
int main(int argc, const char * argv[]) {
// 不用写release, main函数执行完毕后p会被自动释放
Person *p = [[Person alloc] init];
return 0;
}
ARC下的内存管理
本小节知识点:
- 【掌握】ARC下单对象内存管理
- 【掌握】ARC下多对象内存管理
- 【掌握】ARC下循环引用问题
4. 【掌握】ARC下@property参数
1.ARC下单对象内存管理
- 局部变量释放对象随之被释放
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p = [[Person alloc] init];
} // 执行到这一行局部变量p释放
// 由于没有强指针指向对象, 所以对象也释放
return 0;
}
- 清空指针对象随之被释放
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p = [[Person alloc] init];
p = nil; // 执行到这一行, 由于没有强指针指向对象, 所以对象被释放
}
return 0;
}
- 默认清空所有指针都是强指针
int main(int argc, const char * argv[]) {
@autoreleasepool {
// p1和p2都是强指针
Person *p1 = [[Person alloc] init];
__strong Person *p2 = [[Person alloc] init];
}
return 0;
}
- 弱指针需要明确说明
- 注意: 千万不要使用弱指针保存新创建的对象
int main(int argc, const char * argv[]) {
@autoreleasepool {
// p是弱指针, 对象会被立即释放
__weak Person *p1 = [[Person alloc] init];
}
return 0;
}
2.ARC下多对象内存管理
- ARC和MRC一样, 想拥有某个对象必须用强指针保存对象, 但是不需要在dealloc方法中release
@interface Person : NSObject
// MRC写法
//@property (nonatomic, retain) Dog *dog;
// ARC写法
@property (nonatomic, strong) Dog *dog;
@end
3.ARC下循环引用问题
- ARC和MRC一样, 如果A拥有B, B也拥有A, 那么必须一方使用弱指针
@interface Person : NSObject
//@property (nonatomic, retain) Dog *dog;
@property (nonatomic, strong) Dog *dog;
@end
@interface Dog : NSObject
// 错误写法, 循环引用会导致内存泄露
//@property (nonatomic, strong) Person *owner;
// 正确写法, 当如果保存对象建议使用weak
//@property (nonatomic, assign) Person *owner;
@property (nonatomic, weak) Person *owner;
@end
4.ARC下@property参数
- strong : 用于OC对象, 相当于MRC中的retain
- weak : 用于OC对象, 相当于MRC中的assign
- assign : 用于基本数据类型, 跟MRC中的assign一样
ARC和MRC兼容和转换
本小节知识点:
- 【掌握】ARC模式下如何兼容非ARC的类
- 【掌握】如何将MRC转换为ARC
1.ARC模式下如何兼容非ARC的类
- 转变为非ARC -fno-objc-arc
- 转变为ARC的, -f-objc-arc (不常用)