IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    iOS(2)-内存管理 - jinruo.HW

    jinruo.HW发表于 2015-11-07 03:44:00
    love 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)


    本文链接:iOS(2)-内存管理,转载请注明。



沪ICP备19023445号-2号
友情链接