Objective-C内存管理

1.ARC

自动引用计数是指内存管理中对引用采取自动计数的计数.
在Objective-C中采用ARC机制,让编译器来进行内存管理.在新一代Apple LLVM编译器中设置ARC为有效状态,就无需键入retain或release代码.

  • 对象操作与OC方法的对应

    对象操作 Objective-C方法
    生成并持有对象 alloc/new/copy/mutableCopy等方法
    持有对象 retain方法
    释放对象 release方法
    废弃对象 dealoc方法

1.1 所有权修饰符

ARC有效时,id类型和对象类型同c语言其他类型不同,必须附加所有权修饰符,一共四种:

  • __strong修饰符
  • __weak修饰符
  • __unsafe_unretained修饰符
  • __autoreleasing修饰符

__strong是对象类型默认的所有权修饰符.附有__strong修饰符的变量在超出其变量作用域时,即在该变量被废弃时,会释放其被赋予的对象.
__strong修饰符表示对对象的"强引用",持有强引用的变量在超出其作用域时被废弃,随着强引用失效,引用的对象会随之释放.

2.autorelease

autorelease 会像C语言的自动变量那样来对待对象实例.当超出其作用域,对象实例的release实例方法被调用.
autorelease具体使用方法如下:

1.生成并持有NSAutoreleasePool对象;
2.调用已分配对象的autorelease实例方法;
3.废弃NSAutoreleasePool对象.

autorelease实例方法的本质就是调用NSAutoreleasePool对象的addObject方法,将对象添加到自动释放池.在ARC下,使用方式为:

@autoreleasepool {
    id __autoreleasing obj = [[NSObject alloc] init];
}

不使用__autoreleasing修饰符也能使对象注册到autoreleasepool的对象有四种:

  • alloc/new/copy/mutableCopy以外的方法来取得的对象,如:NSArray的array方法等.像这种作为方法返回值的对象(init方法除外);
  • 访问附有__weak修饰符的变量;
  • id或对象的指针,id *obj,NSObject **obj

你可能感兴趣的:(Objective-C内存管理)