A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© u37kl 中级黑马   /  2016-2-20 14:56  /  686 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

MRC机制:
1、MRC机制原理:每个OC对象中都有一个retainCount变量,记录着当前使用该对象的个数,当该变量为0时,系统将释放该对象。
2、MRC机制中的方法:
1>retain:当对象调用该方法时,对象的retainCount变量+1。
2>release:当对象调用该方法时,对象的retainCount变量-1。
3>retainCount:当对象调用该方法时,返回当前对象的retainCount变量的值。如果为系统提供对象,建议不要使用该方法,因为结果不准确。
4>autorelease:将对象加入到栈顶的自动释放池中,并登记,不改变对象的retainCount变量值。
4>dealloc:当要释放该方法时,系统自动调用该方法。

3、MRC下内存管理原则:
1>只要出现new、alloc、copy(创建的对象retainCount变量默认为1),则必须在后面调用一次release方法。
2>只要添加对象的使用者,就必须立即调用retain方法。
3>只要删除对象的使用者,就必须立即调用release方法。
4>若使用者将使用权转移,无需调用任何方法,例如函数中创建一个对象,返回对象时的指针和创建对象时的指针不相同。

4、MRC机制下setter和dealloc方法的写法:
- (void)setDog:(Dog *) d{
    if(_d != d){ // 防止野指针出现。p.d = d1; [d1 release]; p.d = d1;
        [_d release];
        _d = [d retain];
    }
}

- (void)dealloc{
   
    [_d release]; //将对象中所有的成员对象进行一次release操作。
    [super dealloc]; //最后必须调用一次父类的dealloc方法。
}

5、自动释放池:
1>iOS5.0以前创建自动释放池:
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    .......
    [pool release]; // [pool drain];用于mac程序中

2>iOS5.0以后创建自动释放池:
    @autoreleasepool{ // iOS5.0以后创建自动释放池
        Person *p = [[[Person new] autorelease] autorelease]; // 调用两次autorelease方法,会向池中的登记表中登记两次,当池子销毁时,会向该对象发送两次release消息。
    }

3>自动释放池缺点:
  (-)自动释放池会延迟对象的release操作,即当池子被销毁时,才统一对池子中的对象进行release操作。
  (-)避免将占内存大的对象放到池子中。
  (-)避免在同一个池子中做大量的循环操作,造成内存峰值极速上升。

4>自动释放池的应用场景---快速创建类的对象,并将对象加入到栈顶的池子中:
    +(instancetype) person{  // instancetype返回方法所在类的类型。
        return [[[self alloc] init] autorelease]; // 使用self,根据调用的该方法的对象,创建相应对象。
    } // [NSArray array]; 就是快速创建类的对象的方法,相当于[[[NSArray alloc] init] autorelease]

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马