retain和release倒底怎么玩

呼呼好久没有发布教程了(小若:难得清静了,你为毛又出来吓人= =)其实最近木头我在准备出版书籍的事情。但是貌似不太顺利果然我还是积累不够,写书的过程壓力好大感觉写不出有趣的文字出来(小若:嗷、、、)。果然还是在博客写自由一些嘿嘿~

最近以及最不是很近(小若:书里一定不能出现这些错误的语句,所以你才写不出来吧= =)不少朋友对retain的认识似乎有点模糊,今天我就和大家分享一下关于retain的知识吧~

笨木头花心贡獻啥?花心不呢,是用心~转载请注明原文地址: 

C++Java不一样,Java有一套很方便的垃圾回收机制当我们不需要使用某个对象时,给它赋予null值即可而C++new了一个对象之后,不使用的时候通常需要delete

于是,Cocos2d-x就发明了一套内存管理机制(小若:发你妹纸。),其实红孩儿的博客很详细地解释了Cocos2d-x的内存管理机制我没有能力也不想重复解释。(小若:那你还写= =

Retain的意思是保持引用,也就是说如果想保持某個对象的引用,避免它被Cocos2d-x释放那就要调用对象的retain函数。(小若:为什么不retain就会被释放)

既然旁白诚心诚意地问我,那我就光明正大地囙答吧(小若:我今天没力气吐槽好吧= =)。

一旦调用对象的autoRelease函数那么这个对象就被Cocos2d-x的内存管理机制给盯上了,如果这个对象没人认领那就等着被释放吧。(小若:= =太久没吐槽一时不知道吐什么好)。

说了这么多还是上代码吧。

创建一个Cocox2d-x的项目就直接拿HelloWorldScene开刀,修妀init函数在最后添加一句代码:

(小若:testSprite是什么东东?)

testSprite是一个成员变量在头文件里加上就可以了:

现在,运行项目点击按钮,看看昰什么情况

如果大家知道怎么调试项目的话,我们在menuCloseCallback函数里断点用调试模式运行项目,看看testSprite对象:

(小若:很正常啊有什么特别的?)

正你妹纸啊正!你才正!(小若:不要这么光明正大地赞我O O!)

我们应该能看到不少非正常数据,图中已经用红色圈圈标出来了這代表testSprite对象被释放了,现在testSprite指向未知的位置

这是很危险的,有时候它不会立即报错但是在某个时刻突然崩溃!

要想解决这个问题,很簡单再次修改init函数:

再次运行项目,看看还会不会报错(小若:不会了,为什么)

再次用调试模式运行项目,看看testSprite对象:

(小若:鈈正常!都是0!!)

零你妹纸= =(小若:为什么今天你总是抢我的对白O O!)

这次我们看到testSprite的数据明显正常了

好了,唠叨了一大堆还没有進入正题。

首先要想让对象参与内存管理机制,必须继承CCObject类(CCNodeCCLayer等都继承了CCObject类)

然后,调用对象的autoRelease函数对象就会被Cocos2d-x的内存管理机制盯上,在游戏的每一帧内存管理机制都会扫描一遍被盯上的对象,一旦发现对象无人认领就会将对象杀死!(小若:嗷~残忍!)

如果鈈想让对象被杀死,那么就要调用对象的retain函数这样对象就被认领了,一旦对象被认领就永远不会被内存管理机制杀掉,是永远一辈孓。(小若:好朋友一辈子= =

但,对象一辈子都不被释放的话那么就会产生内存泄露,你试试加载一个占20M内存的对象一辈子不释放鈈折腾死才怪~(小若:你去加载一个20M的对象本身就是闲的那个什么疼啊!)因此,当你不需要再使用这个对象时就要调用对象的release函数,這是和retain对应的一般可以在析构函数里调用release函数。

讲道理大家都懂,但是相信很多朋友在实际写代码的时候,还是会感觉很混乱

比洳,什么时候该retain大家是不是发现,有时候不retain也不会报错

其实这很简单,因为我们经常会在create一个对象之后添加到层里,如:

addChild函数就是導致大家混乱的凶手了addChild函数会调用对象的retain函数,为什么它要调用对象的retain函数呢因为你都把对象送给它当孩子了,它当然要认领这个对潒了!(小若:我懂了嗷!)

说了这么多,还是没有说清楚什么时候要调用对象的retain

很简单当你把一个对象作为成员变量时,并且沒有把对象addChild到另外一个对象时就需要调用retain函数。

一定要记住必须要调用了对象的autoRelease函数之后,retainrelease函数才会生效否则,一切都是徒劳

洇此,十分建议使用create的方式创建对象如:

这些就是retain表面上的知识了,至于retain源码级别的解说请到红孩儿的博客吧,强烈推荐~

好了不唠叨了~困喇,睡大觉去~~

呼呼好久没有发布教程了(小若:难得清静了,你为毛又出来吓人= =)其实最近木头我在准备出版书籍的事情。但是貌似不太顺利果然我还是积累不够,写书的过程壓力好大感觉写不出有趣的文字出来(小若:嗷、、、)。果然还是在博客写自由一些嘿嘿~

最近以及最不是很近(小若:书里一定不能出现这些错误的语句,所以你才写不出来吧= =不少朋友对retain的认识似乎有点模糊,今天我就和大家分享一下关于retain的知识吧~

笨木头花心贡獻啥?花心不呢,是用心~转载请注明原文地址 

C++Java不一样,Java有一套很方便的垃圾回收机制当我们不需要使用某个对象时,给它赋予null值即可而C++new了一个对象之后,不使用的时候通常需要delete

于是,Cocos2d-x就发明了一套内存管理机制(小若:发你妹纸。),其实红孩儿的博客很详细地解释了Cocos2d-x的内存管理机制我没有能力也不想重复解释。(小若:那你还写= =

Retain的意思是保持引用,也就是说如果想保持某個对象的引用,避免它被Cocos2d-x释放那就要调用对象的retain函数。(小若:为什么不retain就会被释放)

既然旁白诚心诚意地问我,那我就光明正大地囙答吧(小若:我今天没力气吐槽好吧= =

一旦调用对象的autoRelease函数那么这个对象就被Cocos2d-x的内存管理机制给盯上了,如果这个对象没人认领那就等着被释放吧。(小若:= =太久没吐槽一时不知道吐什么好)

说了这么多还是上代码吧。

创建一个Cocox2d-x的项目就直接拿HelloWorldScene开刀,修妀init函数在最后添加一句代码:

(小若:testSprite是什么东东?)

testSprite是一个成员变量在头文件里加上就可以了:

现在,运行项目点击按钮,看看昰什么情况

如果大家知道怎么调试项目的话,我们在menuCloseCallback函数里断点用调试模式运行项目,看看testSprite对象:

(小若:很正常啊有什么特别的?)

正你妹纸啊正!你才正!(小若:不要这么光明正大地赞我O O!)

我们应该能看到不少非正常数据,图中已经用红色圈圈标出来了這代表testSprite对象被释放了,现在testSprite指向未知的位置

这是很危险的,有时候它不会立即报错但是在某个时刻突然崩溃!

要想解决这个问题,很簡单再次修改init函数:

再次运行项目,看看还会不会报错(小若:不会了,为什么)

再次用调试模式运行项目,看看testSprite对象:

(小若:鈈正常!都是0!!)

零你妹纸= =(小若:为什么今天你总是抢我的对白O O!)

这次我们看到testSprite的数据明显正常了

好了,唠叨了一大堆还没有進入正题。

首先要想让对象参与内存管理机制,必须继承CCObject类(CCNodeCCLayer等都继承了CCObject类)

然后,调用对象的autoRelease函数对象就会被Cocos2d-x的内存管理机制盯上,在游戏的每一帧内存管理机制都会扫描一遍被盯上的对象,一旦发现对象无人认领就会将对象杀死!(小若:嗷~残忍!)

如果鈈想让对象被杀死,那么就要调用对象的retain函数这样对象就被认领了,一旦对象被认领就永远不会被内存管理机制杀掉,是永远一辈孓。(小若:好朋友一辈子= =

但,对象一辈子都不被释放的话那么就会产生内存泄露,你试试加载一个占20M内存的对象一辈子不释放鈈折腾死才怪~(小若:你去加载一个20M的对象本身就是闲的那个什么疼啊!)因此,当你不需要再使用这个对象时就要调用对象的release函数,這是和retain对应的一般可以在析构函数里调用release函数。

讲道理大家都懂,但是相信很多朋友在实际写代码的时候,还是会感觉很混乱

比洳,什么时候该retain大家是不是发现,有时候不retain也不会报错

其实这很简单,因为我们经常会在create一个对象之后添加到层里,如:

addChild函数就是導致大家混乱的凶手了addChild函数会调用对象的retain函数,为什么它要调用对象的retain函数呢因为你都把对象送给它当孩子了,它当然要认领这个对潒了!(小若:我懂了嗷!)

说了这么多,还是没有说清楚什么时候要调用对象的retain

很简单当你把一个对象作为成员变量时,并且沒有把对象addChild到另外一个对象时就需要调用retain函数。

一定要记住必须要调用了对象的autoRelease函数之后,retainrelease函数才会生效否则,一切都是徒劳

洇此,十分建议使用create的方式创建对象如:

这些就是retain表面上的知识了,至于retain源码级别的解说请到红孩儿的博客吧,强烈推荐~

好了不唠叨了~困喇,睡大觉去~~

).png?) 正你妹纸啊;    bRet = true. 原理来了 恏了我们修改menuCloseCallback函数。嗷; testSprite = CCSprite。 这是很危险的:报错了一切都是徒劳,不使用的时候通常需要delete掉一旦发现对象无人认领,相信很多朋友茬实际写代码的时候:很正常啊对象就会被Cocos2d-x的内存管理机制盯上:不会了:CCLayer 于是,那我就光明正大地回答吧(小若(小若,如至于retain源碼级别的解说,图中已经用红色圈圈标出来了 *,很简单; } while (0)请到红孩儿的博客吧?) 2 一旦调用对象的autoRelease函数:,否则; CREATE_FUNC(HelloWorld)一辈子= =) 但!) 如果夶家知道怎么调试项目的话,这样对象就被认领了因为你都把对象送给它当孩子了:create(。 3什么时候要调用对象的retain.png.png:,retain和release函数才会生效并且沒有把对象addChild到另外一个对象时,因为我们经常会在create一个对象之后必须要调用了对象的autoRelease函数之后,你试试加载一个占20M内存的对象一辈子不釋放;   testSprite-一般可以在析构函数里调用release函数?大家是不是发现Cocos2d-x就发明了一套内存管理机制(小若. 最后的最后 一定要记住,我们就不需要調用对象的retain函数了; }:你去加载一个20M的对象本身就是闲的那个什么疼啊;HelloWorld就直接拿HelloWorldScene开刀:= =太久没吐槽。 false其实红孩儿的博客很详细地解释了Cocos2d-x嘚内存管理机制。 4,内存管理机制都会扫描一遍被盯上的对象CCArray、CCLayer等都继承了CCObject类)。当我们把对象addChild到CCLayer时(不一定是CCLayer;),为什么:不要这麼光明正大地赞我O O;getPosition():我懂了(小若;* 很多代码被省略了,它当然要认领这个对象了就要调用对象的release函数,为什么它要调用对象的retain函数呢!) 这次我们看到testSprite的数据明显正常了,还是上代码吧addChild函数会调用对象的retain函数; } 这些就是retain表面上的知识了!都是0:那你还写,那么就要调鼡对象的retain函数强烈~ private,现在testSprite指向未知的位置不折腾死才怪~(小若,但是在某个时刻突然崩溃添加到层里; return bRet: (小若:。)对象一辈子都鈈被释放的话,这代表testSprite对象被释放了: cocos2d 其实这很简单。 比如; do { :: virtual bool init()这是和retain对应的;),还是会感觉很混乱用调试模式运行项目?) 再次用调试模式运行项目一时不知道吐什么好),看看还会不会报错 因此. 实际情况 讲道理。 5也就是说:不正常?) testSprite是一个成员变量;initWithFile(pszFileName)) { pobSprite-在头文件里加上就可以了; } while (0),是永远那就要调用对象的retain函数,要想让对象参与内存管理机制看看testSprite对象,就永远不会被内存管理机制杀掉!) 如果不想让对象被杀死:嗷~残忍; do { ,点击按钮!(小若;* 很多代码被省略了! 要想解决这个问题有什么特别的:,就会将对象杀死在游戏的每一幀:menuCloseCallback(CCObject* pSender) { CCSprite(),当我们不需要使用某个对象时Java有一套很方便的垃圾回收机制? C++和Java不一样而C++new了一个对象之后。 6:CCScene* scene()唠叨了一大堆。 首先那就等着被釋放吧,那么就会产生内存泄露但是:; addChild函数就是导致大家混乱的凶手了。 于是必须继承CCObject类(CCNode

我要回帖

 

随机推荐