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;

   

posted @ 2017-07-17 15:56  晚安早安  阅读(105)  评论(0编辑  收藏  举报