iOS(2)-内存管理
2015-11-07 11:44 jinruo.HW 阅读(482) 评论(0) 收藏 举报内存管理
1.1 自动引用计数
顾名思义,ARC(Automatic Reference Counting)是指内存管理中对饮用采取自动计数的技术。
“在LLVM编译器中设置ARC为有效状态,就无需再次渐入retain或者是release代码”
使用ARC必须满足的条件:
- 使用xcode4.2或以上版本
- 使用llvm编译器3.0或以上版本
- 编译器选项中设置ARC为有效 (build settings)-fobjc-arc
1.2 内存管理
思考:
-
自己生成的对象,自己持有(通过alloc/new/copy/mutableCopy)
//自己生成并持有对象 id obj = [[NSObject alloc] init]; -
不是自己生成的对象,自己也能持有 retain
//非自己生成并持有对象
id obj = [NSMutableArray array];
[obj retain];
- 不再需要自己持有的对象释放 release(释放对象)/delloc(废弃对象)
//自己生成并持有对象
id obj = [[NSObject alloc] init];
[obj release];
- 不是自己持有的对象无法释放
id obj = [[NSObject alloc] init];
[obj release];
[obj release];//运行出错
1.3 管理引用计数
苹果大概是采用散列表(引用计数表)来管理引用计数。
1.4 ARC规则
-
所有权修饰符
-
__strong id类型和对象类型默认的所有权修饰符
该修饰符修饰的变量在超出其作用域时被废弃,随着强引用的实效,引用的对象将被废弃
{ id __strong obj = [[NSObject alloc]init]; } //函数外obj超出作用域,强引用实效,自动释放自己持有的对象,对象所有者不存在,因此被废弃 ```- __weak 解决循环引用
循环引用容易造成内存泄漏,所谓内存泄漏就是应当被废弃的对象在超出其生存周期后继续存在
- __unsafe _ unretained
该修饰符修饰的变量不属于编译器的内存管理对象
- __autoreleasing
在访问__weak修饰符的变量时,实际上必定要访问到注册到autoreleasingpool的对象
id __weak obj1 = obj0; NSLog(@"class = %@",[obj1 class]); ``` //以下代码与上述一致id __weak obj1 = obj0;
id __autoreleasing tmp = obj1;
NSLog(@"class = %@",[tmp class]);这是因为__weak修饰符只持有对象的弱引用,而在访问引用对象时,该对象可能被废弃,如果把要访问的对象注册到autoreleasingpool中,那么在@autoreleasingpool块结束之前都能确保对象存在,因此在访问__weak修饰符的变量时,实际上必定要访问到注册到autoreleasingpool的对象 -
| 属性声明的属性 | 所有权修饰符 |
|---|---|
| assign | __unsafe _ unretained |
| copy | __strong |
| retain | __strong |
| strong | __strong |
| unsafe_retained | __unsafe _ unretained |
| weak | __weak |
-
规则
- 不能使用retain/release/retainCount/autorelease
- 不能使用NSAllocateObject/NSDeallocateObject
- 须遵守内存管理的方法命名规则
- 不要显显式调用dealloc
- 不能使用区域(NSZone)
- 对象型变量不能作为c语言结构体的成员
- 显式转换“id”和“void”(__bridge/toll-free bridge)
- 使用@autoreleasepool块代替NSAutoreleasePool
浙公网安备 33010602011771号