Objective-C内存管理知识梳理

内存管理相关知识梳理

黄金法则:

自己生成的对象,自己持有

使用allloc,new,copy,mutableCopy名称开头的方法名,意味着生成的对象自己持有。但allocate,newer,copying,mutableCopyed例外。
其内部实现为(alloc开头为例):

1
2
3
4
-(id)allocObject{
id obj = [[NSObject alloc]init];
return objc;
}

非自己生成的对象,自己也能持有。

1
2
3
4
5
id obj = [NSMutableArray array];
//取得的对象存在,但自己不持有

[obj retain];
//自己持有对象

其内部实现:

1
2
3
4
5
-(id)object{
id obj = [[NSObject alloc]init];
[obj autorelease];
return objc;
}

不在需要自己持有的对象时,调用release释放;

无法释放非自己持有的对象;

Autorelease

即自动释放,类似于C语言中的局部变量的特性。

1
2
3
4
5
6
7
8
9
10
11
12

for(int i = 0;i < imageCount ;i++){
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];

/*
读入图像
大量产生autorelease的对象
*/

[pool drain];
/*autorelease对象被一起release*/
}

ARC:

不能使用retain/release/retainCount/autorelease

不能使用NSAllocateObject/NSdeallocateObject

必须遵守内存管理方法命名规则

MRC中对象的生成和持有必须以以下名称开头:

  • alloc
  • new
  • copy
  • mutableCopy
    ARC时,追加一条规则:
    initialize方法外,方法名以init开头时,必须是实例方法,必须返回对象(不可以返回void),对象必须是id类型或该方法声明类的对象类型。

不能显式调用dealloc

[super dealloc]也不需要,ARC会自动处理。

使用@autoreleasepool块代替NSAutoreleasePool。

ARC时NSAutoreleasePool类不可以使用.

不能使用NSZone

对象型变量不能作为C语言结构体的成员

显式转换id和void*

所有权修饰符:

修饰符 意义
__strong 强引用,默认修饰符
__weak 弱引用,对象废弃时会自动置nil;
__unsafe_unretained 弱引用,但对象废弃时不会自动置nil
__autoreleaseing = =..极少显式调用。