读书笔记:Objective-C高级编程 iOS与OS X多线程和内存管理 ——(持续)

来源:互联网 发布:华住酒店员工流失数据 编辑:程序博客网 时间:2024/05/16 10:45
1.内存管理的思考方式:
  • .自己生成的对象,自己所持有
  • .非自己生成的对象,自己也能持有
  • 不再需要自己持有的对象时释放
  • 非自己持有的对象无法释放
由NSObject类担任下面管理职责

eg: 
    /*     * 取得的对象存在,但是自己不持有     */    id obj = [NSMutableArray array];    /*     * 自己持有对象     */    [obj retain];



2.autrelease
   autorelease对待实例相当于c语言里面的局部变量,出了区域就被废弃(如果对自动释放池进行自动释放,那么会出现异常—>理由:无论调用哪一个对象的autorelease实例方法,实际上是调用NSObject类的autorelease实例方法,但是对于NSAutorelease类,autorelease实例方法已被该类重载,因此运行时会出错)
使用方法:
  1. 生成并持有NSAutoreleasePool对象
  2. 调用已经分配对象的autorelease
  3. 废弃NSAutoreleasePool对象
autrelease生命周期
  1. 自己设定的释放池的生命周期:,超出其作用域就会自动废弃(某一段程序大量生成autorelease对象使用)
  2. 系统的释放池:程序主循环的NSRunLoop或者其他程序可以运行的地方,对释放池对象进行生成,持有和废弃,(程序关闭)
3.ARC下的四种修饰符
     1.__strong、__weak、__unsafe_unretained、__autoreleasing
__strong修饰符是id类型和对象类型默认的所有权修饰符,
__strong、__weak、__autoreleasing修饰符所修饰的自动变量初始化为nil,即:
    id __strong obj0;       id __weak obj1;    id __autoreleasing obj2;    // 等同于下面代码       id __strong obj0 = nil;        id __weak obj1 = nil;    id __autoreleasing obj2 = nil;

// 1.__block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。
2.__weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型(int)。
3.__block对象可以在block中被重新赋值,__weak不可以。
PS:__unsafe_unretained修饰符可以被视为iOS SDK 4.3以前版本的__weak的替代品,不过不会被自动置空为nil。所以尽可能不要使用这个修饰符。

0 0
原创粉丝点击