转载

iOS(2)-内存管理

内存管理

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)

正文到此结束
Loading...