ios内存管理
一、内存管理
1、自动引用计数(ARC,Automatic Reference Counting)是指内存管理中对引用采 取自动计数的技术;
2、ARC对于程序员而言,最具吸引力的一点是:在LLVM 编译器中设置ARC 为有效状态,就无需再次键入retain 或者是release 代码;
3、引用计数式内存管理的思考方式:
1、自己生成的对象,自己所持有;
2、非自己生成的对象,自己也能持有;
3、不再需要自己持有的对象,自己释放;
4、非自己持有的对象,自己无法释放;
4、Cocoa 框架中Foundation 框架类库的NSObject 类担负内存管理的职责;
5、使用alloc、new、copy方法意味着自己生成的对象只有自己持有;
6、用alloc/new/copy/mutableCopy 以外的方法取得的 对象,因为非自己生成并持有,所以自己不是该对象的持有者;
二、ARC
1、ARC有效时,id类型和对象类型必须附加所有权修饰符:__strong、__weak、__unsafe_funretained、__autoreleasing;
2、id和对象类型在没有明确指定所有权修饰符时,默认为__strong修饰符;
3、附有__strong修饰符的对象在超出其变量作用域时,会释放其被赋予的对象;
4、即便是Objective-C类成员变量,也可以在方法参数上,使用附有__strong修饰符的变量;
5、__strong、__week、__autoreleasing修饰符可以保证将附有这些修饰符的自动变量初始化为nil;
6、__weak修饰符还有另一个有点,在持有某对象的弱引用时,若该对象被废弃,则此弱引用将自动失效且处于nil被赋值的状态;
三、ARC规则
1、不能使用retain/release/retainCount/autorelease;
设置ARC有效时,禁止再次键入retain或者是release代码;
2、不能使用NSAllocateObject/NSDeallocateObject;
3、须遵守内存管理的方法命名规则;
4、不要显示调用dealloc;
对象被废弃时,会调用对象的dealloc方法;
5、使用@autoreleasepool快代替NSAutoreleasePoll;
6、不能使用区域(NSZone);
不管ARC是否有效,区域在现在的运行时系统中医单纯的呗忽略;
7、对象类型变量不能作为C语言结构体的成员;
要把对象类型变量加入到结构体成员中时,可强制转换void*或是附加__unsafe_unretained;
附有__unsafe_unretained修饰符的变量不属于编译器的内存管理对象,如果管理时不注意赋值对象的所以者,可能遭遇内存泄漏
或程序奔溃;
8、显式转换id和void*;
id型或者对象类型变量赋值给void*或者逆向赋值时都需要进行特定的转换,如果只是单纯的赋值,则可以使用‘__bridge’转换
id obj = [[NSObject alloc] init];
void * p = (__bridge void *)obj;
id o = (__bridge id)p;