4. MRC

作者: 算命的李老师 | 来源:发表于2020-09-25 17:45 被阅读0次

MRC

底层实现是否一样
  • 自己生成的对象,自己持有

在iOS内存管理中有四个关键字,alloc、new、copy、mutableCopy,自身使用这些关键字产生对象,那么自身就持有了对象

    // 使用了alloc分配了内存,obj指向了对象,该对象本身引用计数为1,不需要retain 
    id obj = [[NSObject alloc] init]; 
    // 使用了new分配了内存,objc指向了对象,该对象本身引用计数为1,不需要retain 
    id obj = [NSObject new];
  • 非自己生成的对象,自己也能持有
    //NSMutableArray通过类方法array产生了对象(并没有使用alloc、new、copy、mutableCopt来产生对象)
    //因此该对象不属于obj自身产生的
    // 因此,需要使用retain方法让对象计数器+1,从而obj可以持有该对象(尽管该对象不是他产生的)
    id obj = [NSMutableArray array];
    [obj retain];
  • 不需要自己持有的对象时释放
    id obj = [NSMutableArray array];  
    [obj retain];
    // 当obj不在需要持有的对象,那么,obj应该发送release消息
    [obj release];
     
    // 释放了对象还进行释放,会导致奔溃
    [obj release];
  • 无法释放非自己持有的对象
    // 释放一个不属于自己的对象
    id obj = [NSMutableArray array]; 
     
    // obj没有进行retain操作而进行release操作,然后autoreleasePool也会对其进行一次release操作,导致奔溃。
    后面会讲到autorelease。
    [obj release];

MRC没有strong,weak,局部变量对象就是相当于基本数据类型。MRC给成员属性赋值,一定要使用set方法,不能直接访问下划线成员属性赋值,因为使用下划线是直接赋值(如_name = name),而set方法会多做影响引用计数方面的事情,比如retain。

MRC内存是怎么分配
-(void)setName:(NSString *)name
{
    if(_name != name)
    {
    [_name release];
    _name = [name retain];
    //_name = [name copy];
    }
}

-(NSString *)brand{
    //将实例变量的引用计数加1后,添加自动减1
    //作用,保证调用getter方法取值时可以取到值的同时在完全不需要使用后释放
    return [[_brand retain] autorelease];
}

//MRC下 手动释放内存 可重写dealloc但不要调用dealloc  会崩溃
-(void)dealloc{
    [_string release];
    //必须最后调用super dealloc
    [super  dealloc];
}

相关文章

网友评论

      本文标题:4. MRC

      本文链接:https://www.haomeiwen.com/subject/egadektx.html