Objective-c 内存管理-MRC retain&release

Objective-C提供了三种内存管理方式: 

 

                       MannulReference Counting(MRC,手动管理,在开发 iOS4.1之前的版本的项目时我们要自己负责使用引用计数来管理内存,比如要手                                          动 retainreleaseautorelease ,而在其后的版本可以使用 ARC,让系统自己管理内存。 

                       automatic reference counting(ARC,自动引用计数,iOS5 之后推出的 

                       garbage collection(垃圾回收)iOS不支持垃圾回收; ARC作为苹果新提供的技术,苹果推荐开发者使用ARC技术来管理内存 

引用计数器:

    每个OC对象都有自己的引用计数器,是一个整数表示对象被引用的次数(有多少个所有者),即现在有多少东西在使用这个对象。对象刚被创建时,默认计数器值为1,当计数器的值变为0时,则对象销毁。

 

  • retain消息:使计数器+1,该方法返回对象本身。 

  • release消息:使计数器-1(并不代表释放对象)。 


使用注意:

      规则:

  • 如果你通过alloc,new,copy来创建了一个对象,那么你就必须对应的调用release或者 autorelease方法
  • 当产生一个新的引用的时候, 需要将对象引用计数器 +1, 即调用对象的 retain 方法Person *p2 = [p1 retain]
  • 谁让对象retain的,就由谁release,即当某个引用不再指向该对象的时候,就需要将该对象的引用计数器-1,

   1)
     当引用计数器为0时,对象会被回收;
   被回收的对象叫做:僵尸对象;
     (当计数器为0时,对象变为僵尸对象,使用retain不能够救活僵尸对象)
   指向僵尸对象的指针叫做:野指针
    

   2)
      retain release个数不不匹配时,会造成 内存泄漏;
         (如果 retain了没有release,这时引用计数器不为0,对象不会进行回收,导致内存泄漏)


   3)
     retain可以封装到set方法中 release 写进dealloc
     程序员new了电视,女孩过来看电视,只要女孩还在看电视,那么电视就不能释放,直到女孩走了,在释放电视,如果电视已经释放,那么女孩看的的电视就是僵尸对象了,女孩指向电视,女孩就是野指针
     retain 封装到set方法中,只要女孩看电视引用计数器就会加一,走了就减一(封装到set中部分会引起野指针错误,需另做判断,或者用@property 带参数解决)

#import <Foundation/Foundation.h>

#pragma mark - 电视

@interface Tv : NSObject

@end


@implementation Tv

@end


#pragma mark - 女孩

@interface Girl :NSObject{

    Tv * _tv;//Tv作为Girl的成员变量

}

-(void)setTv:(Tv *)tv;//setter方法

-(Tv *)tv;//getter方法

-(void)dealloc;

@end

@implementation Girl

-(void)setTv:(Tv *)tv{

    //girl取得tv时直接让tv retain

   self->_tv = [tvretain];

}

-(Tv *)tv{

   return_tv;

}

-(void)dealloc{

    //girl释放时,tv release

    //retain,release:取得时retain,释放时release

    [_tvrelease];

    [superdealloc];

}

@end

int main(int argc,constchar * argv[]) {

    //实例化Tv对象

   Tv * tv = [Tvnew];

    //实例化Girl

   Girl * girl = [Girlnew];

    //tv传递给girl

    girl.tv = tv;

    //创建了对象,就要release

    [tvrelease];

    [girlrelease];

    return 0;

}



   4)
     retain 循环 : 使用@property 带retain 有可能会造成 循环





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值