ios retain release和release倒底怎么玩

转自于http://blog.csdn.net/chaoyuan899
& & 范围:
任何继承了NSObject
的对象,对基本数据类型无效
每个对象内部都保存了一个与之相关联的整数,称为引用计数器(auto reference count)每当使用 alloc、new或者copy创建一个对象时,对象的引用计数器被设置为1给对象发送一条retain消息(即调用retain方法),可以使引用计数器值+1给对象发送一条release消息,可以使引用计数器值-1当一个对象的引用计数器值为0时,那么它将被销毁,其占用的内存被系统回收,OC也会自动向对象发送一条dealloc消息。一般会重写dealloc方法,在这里释放相关资源。一定不要直接调用dealloc方法。可以给对象发送retainCount消息获得当前的引用计数器值。
内存管理原则
谁创建,谁释放(“谁污染,谁治理”)。如果你通过alloc、new或者(mutable)copy来创建一个对象,那么你必须调用release或autorelease。或句话说,不是你创建的,就不用你去释放一般来说,除了alloc、new或copy之外的方法创建的对象都被声明了autorelease(autorelease是延迟释放内存,不用你自己去手动释放,系统会知道在什么时候该去释放掉它。)谁retain,谁release。只要你调用了retain,无论这个对象是如何生成的,你都要调用release
下面是测试代码:
新建一个基于“Command Line Tool”的工程,名为“内存管理1-retain和release的简单使用”,再新建一个Student类。
&&&&&&&&&&&&&&&&#import&&Foundation/Foundation.h&&&&&@interface&Student&:&NSObject&&{&&&&&&int&&&}&&&&@property&int&&&&&@end&&
&&&&&&&&&&&&&&&&#import&&Student.h&&&&&@implementation&Student&&&&@synthesize&&&&&&&-&(void)dealloc{&&&&&&&&&&&&&&&&&&NSLog(@&%@被销毁了&,self);&&&&&&&&&&&&[super&dealloc];&&}&&&&@end&&
&&&&&&&&&&&&&&&&#import&&Foundation/Foundation.h&&&#import&&Student.h&&&&&int&main(int&argc,&const&char&*&argv[])&&{&&&&&&&&@autoreleasepool&{&&&&&&&&&&&&&&&&&&&&Student&*stu&=&[[Student&alloc]init];&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&NSLog(@&count:%zi&,&[stu&retainCount]);&&&&&&&&&&&&&&&&&&&&[stu&retain];&&&&&&&&&&NSLog(@&count:%zi&,&[stu&retainCount]);&&&&&&&&&&&&&&&&&&&&[stu&release];&&&&&&&&&&NSLog(@&count:%zi&,&[stu&retainCount]);&&&&&&&&&&&&&&&&&&&&&&&&&&&&[stu&release];&&&&&&&&&&&&&&&&}&&&&&&return&0;&&}&&
运行结果:
10:53:14.506内存管理1-retain和release的简单使用[754:303]
10:53:14.508内存管理1-retain和release的简单使用[754:303]
10:53:14.509内存管理1-retain和release的简单使用[754:303]
10:53:14.509内存管理1-retain和release的简单使用[754:303]
&Student: 0x&被销毁了
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:97837次
积分:1271
积分:1271
排名:千里之外
原创:22篇
转载:58篇
(2)(5)(6)(2)(1)(1)(5)(1)(3)(9)(3)(2)(2)(2)(2)(6)(11)(7)(1)(1)(1)(2)(5)(1)(1)Pages: 1/2
主题 : release后retainCount还是1,且还可以使用一次
级别: 新手上路
可可豆: 10 CB
威望: 10 点
在线时间: 2(时)
发自: Web Page
来源于&&分类
release后retainCount还是1,且还可以使用一次&&&
//retainCount = 1[obj release];NSLog(@&%d&,[obj getID]);为何还可以输出正确的值,但是再输出一次,就会报错了。修改成如下的样子还是一样。[obj release];obj =NSLog(@&%d&,[obj getID]);新手学习中,看书上讲,release后引用计数会减1的。加断点看了,确实也执行了delloc的。求高手讲解。
级别: 禁止发言
可可豆: 60 CB
威望: 60 点
在线时间: 1(时)
发自: Web Page
用户被禁言,该主题自动屏蔽!
级别: 侠客
UID: 267798
可可豆: 207 CB
威望: 201 点
在线时间: 197(时)
发自: Web Page
我们老师说 这个问题不用纠结,他release掉引用计数就是0最后打出来是1那就是1&&你知道他的引用计数是0就好了
级别: 精灵王
可可豆: 3978 CB
威望: 3960 点
在线时间: 484(时)
发自: Web Page
回 2楼(amoylong) 的帖子
你可以尝试,一个按钮,嗲用release,另外一个调用打印。一般 retaincount 虽然relase就-1,但是对象在内存中对应的地址的释放不是立即的。你可以理解为,当前方法执行结束或者内存严重不足的时候,会释放。
级别: 骑士
UID: 90233
可可豆: 118 CB
威望: 1428 点
在线时间: 423(时)
发自: Web Page
回 楼主(wswwaizh) 的帖子
真正销毁内存是在执行[super dealloc];之后
是金子总会花光
级别: 骑士
可可豆: 811 CB
威望: 731 点
在线时间: 78(时)
发自: Web Page
回 3楼(goofysun) 的帖子
你可以理解为,当前方法执行结束或者内存严重不足的时候,会释放。这句话有偏差1. 当前方法执行结束,&&&&&&&&先说 这样的措辞严格说是错误的,应该用runloop去理解,然后其实release之后,你再去调用,绝对的野指针,无需等什么方法执行完2. 内存严重不足的时候,会释放&&&&&& 这个是另外一回事了。。。autorelease都是runloop后释放,receive memory warning是另外询问和释放的另外一个范畴了
ivanchan.github.io
级别: 版主
UID: 123750
发帖: 2041
可可豆: 3425 CB
威望: 3346 点
在线时间: 1469(时)
发自: Web Page
引用计数的问题不必纠结,不光你自己alloc或者copy会导致引用计数增加,系统自己也会将之增减,只不过系统增加了多少,它自己会减少多少,你不要用打印引用计数的方法来查看操作是否正确,举个简单的例子&&a = [aclass alloc] init]&&这时候a的计数是1&&[b addsubview a] 这时候a的计数应该是2或者更多 你relese之后 只会减1,至于此时a的计数到底是多少 是不确定的,可以肯定的是,再你操作对a从初始化到最后操作完毕之后,dealloc 之前,a的计数应该是1,否则不能释放
级别: 精灵王
可可豆: 3978 CB
威望: 3960 点
在线时间: 484(时)
发自: Web Page
回 5楼(ismeivan) 的帖子
你说的是正常的情况下的理解方式。runloop说法对于新人来说还是不是很直接。另外realse之后再调用还能调用的的问题,我做了这么多年也是经常遇到,也曾经试图寻找原因,就像6楼说的,很多时候都会出现realse过后还能调用的现象。而且对象不是autorealse的。我还遇到过奇葩的是,每次要等上好几秒钟再调用才会出现空指针异常。(代码里绝对没有手动多线程)还有很多时候跟你测试的硬件环境还有关,可以说,ios的内存管理策略虽然一如既往的是一套,但是每个版本都有细微的变化,使用中还是能感觉出来,只是没有官方的说明,无法正确的解释。不过随着一些界面业务该用autorelease之后,这种现象越来越不关注了。
级别: 骑士
可可豆: 811 CB
威望: 731 点
在线时间: 78(时)
发自: Web Page
回 7楼(goofysun) 的帖子
另外realse之后再调用还能调用的的问题,我做了这么多年也是经常遇到,也曾经试图寻找原因,唯一的可能是,这块内存还没有被重写,这个可能的确是有的,因为你不用一块内存,不代表内容真的清除掉,只是一个指针的单纯移除而已,更好运气是刚好被重写为0,这样是空爷不会崩溃这个和iOS无关,几乎所有的OS都有这个情况autorelease什么时候真正释放,这个google一堆了,就不展开了
ivanchan.github.io
级别: 精灵王
可可豆: 3978 CB
威望: 3960 点
在线时间: 484(时)
发自: Web Page
回 8楼(ismeivan) 的帖子
其实情况挺多的,你说的是一种,另外一种是,你的变量指针指向的地址,正好被 另一个对象用来存储了,这样,你release之后发现,对象实体还是存在的,有可能已经不是原来的实体了。但是,再release一次,可能就会影响到其他的对象实体了
Pages: 1/2
关注本帖(如果有新回复会站内信通知您)
苹果公司现任CEO是谁?2字 正确答案:库克
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 浏览移动版}

我要回帖

更多关于 ios retain release 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信