sas retain语句和release倒底怎么玩

cocos2dx(8)
转载请注明,原文地址:
1.&为什么会有?
C++和不一样,有一套很方便的垃圾回收机制,当我们不需要使用某个对象时,给它赋予值即可。而了一个对象之后,不使用的时候通常需要掉。
于是,就发明了一套内存管理机制(小若:发你妹纸。。。),其实红孩儿的博客很详细地解释了的内存管理机制,我没有能力也不想重复解释。(小若:那你还写?)
Retain的意思是保持引用,也就是说,如果想保持某个对象的引用,避免它被释放,那就要调用对象的函数。(小若:为什么不就会被释放?)
2.&真正的凶手
既然旁白诚心诚意地问我,那我就光明正大地回答吧(小若:我今天没力气吐槽,好吧)。
一旦调用对象的函数,那么这个对象就被的内存管理机制给盯上了,如果这个对象没人认领,那就等着被释放吧。(小若:太久没吐槽,一时不知道吐什么好)。
3.&看代码实际点
说了这么多,还是上代码吧。
创建一个的项目,就直接拿开刀,修改函数,在最后添加一句代码:
然后,最关键的来了,我们修改函数:
现在,运行项目,点击按钮,看看是什么情况?
(小若:报错了!)
如果大家知道怎么调试项目的话,我们在函数里断点,用调试模式运行项目,看看对象:
(小若:很正常啊,有什么特别的?)
正你妹纸啊,正!你才正!(小若:不要这么光明正大地赞我!)
我们应该能看到不少非正常数据,图中已经用红色圈圈标出来了,这代表对象被释放了,现在指向未知的位置。
这是很危险的,有时候它不会立即报错,但是在某个时刻突然崩溃!
要想解决这个问题,很简单,再次修改函数:
再次运行项目,看看还会不会报错?(小若:不会了,为什么?)
再次用调试模式运行项目,看看对象:
(小若:不正常!都是!!)
零你妹纸(小若:为什么今天你总是抢我的对白!)
这次我们看到的数据明显正常了。
4.&原理来了
首先,要想让对象参与内存管理机制,必须继承类(、等都继承了类)。
然后,调用对象的函数,对象就会被的内存管理机制盯上,在游戏的每一帧,内存管理机制都会扫描一遍被盯上的对象,一旦发现对象无人认领,就会将对象杀死!
如果不想让对象被杀死,那么就要调用对象的函数,这样对象就被认领了,一旦对象被认领,就永远不会被内存管理机制杀掉,是永远,一辈子。(小若:好朋友,一辈子)
但,对象一辈子都不被释放的话,那么就会产生内存泄露,你试试加载一个占内存的对象一辈子不释放,不折腾死才怪(小若:你去加载一个的对象本身就是闲的那个什么疼啊!)因此,当你不需要再使用这个对象时,就要调用对象的函数,这是和对应的。一般可以在析构函数里调用函数。
5.&实际情况
讲道理,大家都懂,但是,相信很多朋友在实际写代码的时候,还是会感觉很混乱。
比如,什么时候该?大家是不是发现,有时候不也不会报错?
其实这很简单,因为我们经常会在一个对象之后,添加到层里,如:
testSprite&=&CCSprite::create(&HelloWorld.png&);
this-&addChild(testSprite);
addChild函数就是导致大家混乱的凶手了,函数会调用对象的函数,为什么它要调用对象的函数呢?因为你都把对象送给它当孩子了,它当然要认领这个对象了!(小若:我懂了,嗷!)
于是,当我们把对象到时(不一定是,、都行),我们就不需要调用对象的函数了。
6.&那到底什么时候要?
说了这么多,还是没有说清楚,什么时候要调用对象的。
很简单,当你把一个对象作为成员变量时,并且没有把对象到另外一个对象时,就需要调用函数。
7.&最后的最后
一定要记住,必须要调用了对象的函数之后,和函数才会生效,否则,一切都是徒劳。
因此,十分建议使用的方式创建对象,如:
总结一下:
在create里会调用autorelease(),使引用计数+1
之后使用retain()使的引用计数再+1(如果是addchild,这个函数里面会调用retain())
//当然, 如果在调用retain后再调用addchild,会生效的retain只有一个。
之后不用的时候必须调用release来释放,否则内存泄露, 一般都在析构中进行
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:4642次
排名:千里之外
转载:19篇
(1)(1)(1)(3)(2)(5)(1)(2)(5)(4)OC&的&alloc、retain、release&OC的内存管理
& &alloc函数是创建对象使用,创建完成后计数器加
& 只使用一次
& retain 是对一个对象的计数器加 1
&可以调用多次
&release 是对一个对象的计数器减 1
&减到0 对象就会从内存中释放掉
& 内存管理总结
Objetctive-C的内存管理机制与.net/java那种全自动的立即回收机制是不同的,它本质上还是C语言中的手动管理方式,只不过稍微加了一些自动方法。
2:Objective-C的内存管理是基于引用计数的。要做的事情只是关注的引用,而释放内存的工作实际上由运行环境完成。
3:在最简单的情形中,分配的(alloc)对象,或者是保留(retain)在一些地方的对象,都需要发送一个release消息。这也意味着,如果使用了一次alloc,然后又retian了一次,那你需要release两次才能释放该对象的内存。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。下次自动登录
现在的位置:
& 综合 & 正文
Xcode4.2中的release,retainCount, retain“不能”使用的理解和的解决办法
Automatic Reference Counting (ARC),自动引用计数,是开发Cocoa时的一个编译级别的特性,用于自动内存管理。
  1:在XCode 4.2中,使用模板新建一个工程,该工程将”默认“选择使用ARC特性
  2:对于已经建立好的项目可以 选中项目, Building Settings, 然后找到 Objective C Automatic Reference Counting(找不到,可以搜索到), 设置改为No 就行了.
  ----ARC理论基础---
  ARC的工作原理是,在你编译程序时,将内存操作的(retain,release或autorelease)自动添加到需要的位置。即底层上使用和Manual Reference Counting(手工引用计数)一样的内存管理机制,但由于XCode自动帮你在编译时添加内存操作的代码,从而简化了编程的工作。
  启用ARC,编译选项中需加上-fobjc-arc,不过这个由XCode在创建工程模板时帮你完成。
  XCode 4.2以前版本都不支持ARC。
  对操作系统也有要求:Mac OS X v10.6或v10.7 (64-bit applications),iOS4或iOS5。注意:其中Mac OS X v10.6和iOS4不支持weak references(弱引用,后面会说明什么是weak references)。
  Xcode 4.2提供了一个名为“Convert to Objective-C Automatic Reference Counting”的工具,在Edit-&Convert menu下,可以帮你自动将使用Manual Reference Counting的老代码转换成使用ARC的新代码(例如去掉对retain和release的调用)。
xcode4.2 引入了ARC (AutomicReferenceCounting) , 使用xcode4.2 新建项目时,会有一些小小的变化。
NSAutoReleasePool
被 @ {Autoreleasepool / / Code for autoreleasepool } block 取代了。
新增了__strong
, __weak 编译指令。
ios5.0知道你的变量在何时需要release,何时需要autorelease,所以变量不要写成全局的,全局的变量用single去代替。
解决办法:在项目中关闭
ARC 功能,在项目属性中将Object-C Automatic Reference Counting设置为NO即可。否则在编译时,会对 release ,retainCount, retain 等内存相关操作在编译时出现红色警告。
如下图:设置为No即可。
&&&&推荐文章:
【上篇】【下篇】retain和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网站的观点或立场
访问:71851次
排名:千里之外
原创:13篇
转载:52篇
(2)(1)(1)(5)(1)(3)(9)(3)(2)(2)(2)(2)(6)(11)(7)(1)(1)(1)(2)(5)(1)(1)}

我要回帖

更多关于 sas retain语句 的文章

更多推荐

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

点击添加站长微信