retain release和release倒底怎么玩

retain和release倒底怎么玩_百度知道
retain和release倒底怎么玩
提问者采纳
3,好吧= =);
然后:create(& private。(小若。);addChild(testSprite),如,不使用的时候通常需要delete掉:你去加载一个20M的对象本身就是闲的那个什么疼啊:嗷~残忍,看看还会不会报错。(小若,给它赋予null值即可. 看代码实际点 说了这么多;HelloWorld,那就要调用对象的retain函数,要想让对象参与内存管理机制:好朋友?) testSprite是一个成员变量;),还没有进入正题!
要想解决这个问题。
比如,这样对象就被认领了:
cocos2d::很正常啊;
CREATE_FUNC(HelloWorld).png&quot:testSprite是什么东东;autorelease(),正。 因此,那就等着被释放吧。:
(小若。而C++new了一个对象之后:不会了!(小若,一辈子,当你把一个对象作为成员变量时:
(小若。。 很简单;
CC_SAFE_DELETE(pobSprite),看看testSprite对象:
virtual bool init()、CCNode都行)。,现在testSprite指向未知的位置,如果这个对象没人认领,我没有能力也不想重复解释,有时候不retain也不会报错,什么时候要调用对象的retain,那么这个对象就被Cocos2d-x的内存管理机制给盯上了。,否则; }:. 那倒底什么时候要retain,我们在menuCloseCallback函数里断点,并且没有把对象addChild到另外一个对象时,它当然要认领这个对象了,对象就会被Cocos2d-x的内存管理机制盯上,大家都懂; this-&gt,为什么,就要调用对象的release函数;
void menuCloseCallback(CCObject* pSender)。 *&#47,必须继承CCObject类(CCNode,但是;
return pobSprite,是永远;retain();* 很多代码被省略了。!)
如果大家知道怎么调试项目的话:create(const char *pszFileName) {
CCSprite *pobSprite = new CCSprite();
&#47:. 最后的最后 一定要记住:发你妹纸。 *&#47::不要这么光明正大地赞我O O;getPosition().png&quot:为什么今天你总是抢我的对白O O。 这是很危险的。,那么就会产生内存泄露;HelloWorld,当我们不需要使用某个对象时。!(小若。
7:CCSprite* testSprite:,不唠叨了~困喇,调用对象的autoRelease函数。
于是,一辈子= =)
但,当我们把对象addChild到CCLayer时(不一定是CCLayer!都是0:= =太久没吐槽。: testSprite = CCSprite:menuCloseCallback(CCObject* pSender) {
testSprite-&* 很多代码被省略了? (小若;   testSprite-&gt?因为你都把对象送给它当孩子了,不折腾死才怪~(小若,还是没有说清楚。
然后。 首先,也就是说!(小若,在游戏的每一帧,还是会感觉很混乱:报错了,有什么特别的,最关键的来了,点击按钮:CCLayer { public,一旦发现对象无人认领!)
这次我们看到testSprite的数据明显正常了,那我就光明正大地回答吧(小若? 说了这么多,再次修改init函数:为什么不retain就会被释放,其实红孩儿的博客很详细地解释了Cocos2d-x的内存管理机制,但是在某个时刻突然崩溃;
testSprite = CCSprite:。;
} while (0)!) 零你妹纸= =(小若?大家是不是发现,唠叨了一大堆: CCSprite* CCSprite,我们就不需要调用对象的retain函数了::那你还写,就永远不会被内存管理机制杀掉,如. 真正的凶手autoRelease 既然旁白诚心诚意地问我;
if (pobSprite && pobSprite-&   
bRet = true,十分建议使用create的方式创建对象;
再次运行项目。:我懂了;
testSprite = CCSprite!)因此,你试试加载一个占20M内存的对象一辈子不释放:create(&quot。
一旦调用对象的autoRelease函数,看看testSprite对象;
return bRet,一切都是徒劳,如果想保持某个对象的引用;
return NULL。
6?(小若?)
2,这代表testSprite对象被释放了!)
如果不想让对象被杀死,修改init函数:我今天没力气吐槽,内存管理机制都会扫描一遍被盯上的对象?) 正你妹纸啊;)、CCLayer等都继承了CCObject类),在头文件里加上就可以了,运行项目!你才正。 创建一个Cocox2d-x的项目,图中已经用红色圈圈标出来了,那么就要调用对象的retain函数,这是和retain对应的,当你不需要再使用这个对象时:create(&
} while (0):;HelloWorld? 其实这很简单。一般可以在析构函数里调用release函数: class HelloWorld :init() {
bool bRet = false,CCArray?= =)
Retain的意思是保持引用,很简单!)
我们应该能看到不少非正常数据,一时不知道吐什么好): bool HelloWorld,因为我们经常会在create一个对象之后,避免它被Cocos2d-x释放。
4,必须要调用了对象的autoRelease函数之后,就需要调用retain函数,Cocos2d-x就发明了一套内存管理机制(小若. 实际情况 讲道理: bool HelloWorld. 为什么会有retain,在最后添加一句代码!)
于是;initWithFile(pszFileName))
pobSprite-&gt,就直接拿HelloWorldScene开刀,嗷; }
现在:CCScene* scene(),就会将对象杀死;),添加到层里;
addChild函数就是导致大家混乱的凶手了,用调试模式运行项目:不正常. 原理来了 好了。;
return bRet,相信很多朋友在实际写代码的时候,retain和release函数才会生效; }
(小若:,还是上代码吧,什么时候该retain,看看是什么情况? C++和Java不一样,对象一辈子都不被释放的话: public cocos2d,一旦对象被认领;
static cocos2d?) 再次用调试模式运行项目,为什么它要调用对象的retain函数呢.png&quot,Java有一套很方便的垃圾回收机制,addChild函数会调用对象的retain函数,强烈推荐~
好了:init() {
bool bRet = false。(小若。!,有时候它不会立即报错;
&#47,请到红孩儿的博客吧,我们修改menuCloseCallback函数1。(小若: void HelloW }
这些就是retain表面上的知识了,至于retain源码级别的解说
知道智能回答机器人
我是知道站内的人工智能,可高效智能地为您解答问题。很高兴为您服务。
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁cocos2d-x 内存管理 retain release_cocos2dx吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:7,932贴子:
cocos2d-x 内存管理 retain release收藏
对于内存管理,官网上有很详细的解释
但是从自己的使用经验和网上的搜索内容来看,还是有很多人被这个问题所困惑。
知识这个东西,就是以自己的思维方式理解了才能成为自己的。所以在这里整理一下自己的理解。
cocos2d-x的内存管理:
1. 如果所有的类都是自己开发的,并且你熟悉c++, 那么尽管用c++的new, delete机制,不会有任何问题。
2. 所谓内存管理,换一句话说就是内存自动回收。其好处是:自己负责申请内存,系统自动判断是否可以释放回收,这样程序员就省事了(也减少了犯错的几率)。
2. 所有从cocos2d::CCObject 派生出来的类都是通过setautorelease()来实现内存自动回收的,具体来说就是当游戏每一帧结束的时候,如果没有人声明需要new出来的这块基于CCObject的内存,那么,这快内存就会被释放掉
3. 如果一块基于CCObject的内存(用指针指示)被retain过一次,就表示这块内存里的东西多了一个人需要。
4. 当一块基于CCObject的内存(用指针指示)被release过一次,就表示这块内存里的东西少了一个人需要。
5. 当retain和release的次数相等时,表示已经没有人需要这块内存,那么按照第2条原则,这块内存在当前帧结束后就释放掉了,原先的指向此处的指针没有意义了。
6. 所谓用create方法创建出来的内存默认都是调用了setautorelease()的。这也是cocos2d-x里创建类的标准方式。
7. 当调用addChild时自动调用了retain, 对应的removeChild自动调用了release
基于以上几点,我们就可以理解:
1 为什么大部分情况下,我们不需要调用retain,release----------------因为大部分情况下我们通过调用addChild/removeChild的方式自动完成了这些调用
2 什么情况下,我们需要自己retain------------------------------------------create了但是没有addChild的指针(内存)
3 什么情况下,我们需要自己release---------------------------------------- a 你自己retain了,那你就要自己release
b 你用new函数产生一个派生自CCobject的对象,你可以用delete干掉它,也可以用release干掉它
因为实际上,release里面发现没人用这个内存时,自己就delete掉自己了
好吧,看下这几个让很多人迷糊的函数,到底有多简单:
//--------------调用它相当于说:有一个人不需要这块内存了,如果其他人也不需要了,那把内存delete掉
void CCObject::release(void) { CCAssert(m_uReference & 0, &reference count should greater than 0&); --m_uR
if (m_uReference == 0) { } }
//--------------调用它相当于说:这块内存我需要啊(言下之意:你们别给我扔了,老子还用呢)
void CCObject::retain(void) { CCAssert(m_uReference & 0, &reference count should greater than 0&);
//-------------调用它相当于说:妈(妈指的是:CCPoolManager,也就她能这么不辞辛苦给你擦屁股),这块内存你帮我看着,每帧结束的时候你都去看一眼,要是没人用,你就帮我删了。 CCObject* CCObject::autorelease(void) { CCPoolManager::sharedPoolManager()-&addObject(this); }
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或主题 : release对象后为什么retaincount还是1
级别: 新手上路
可可豆: 280 CB
威望: 240 点
在线时间: 74(时)
发自: Web Page
release对象后为什么retaincount还是1&&&
技术问题发到问答:我知道,我仍旧要在论坛继续发布问题
ide是xcode4.3.3,project的模板用的是mac的command line tool,没用arc是mrc,写了段很简单的代码,只是想看看retaincount的变化,如下:#pragma mark -#pragma mark TestObj2@interface TestObj2 : NSObject- (void)isR@end@implementation TestObj2- (void)isRelease{ printf(&i am here! retain count is--&%lu\n&, [self retainCount]);}@end问题出在main函数中:TestObj2 *aTestObj2 = [[TestObj2 alloc] init];然后立即release:[aTestObj2 release];Obj2在release后调用-isRelease,还可以成功打印输出:[aTestObj2 isRelease];   //此时在console中能输出i am here! retain count is--&1我的理解是obj2被release后,再调-isRelease时应该报错才对,因为此时obj2对象已经被release掉不存在了,但为什么实际上却能打印输出呢?是不是-release只是标记该段内存可重新使用但内容并不清空,由于该程序段在obj2的release后并未对该段函数内存做修改,所以该函数指针仍旧指向原地址并成功调用?
级别: 骑士
可可豆: 1050 CB
威望: 1050 点
在线时间: 983(时)
发自: Web Page
aTestObj2&&= nil;习惯性就算release了在附nil
级别: 新手上路
可可豆: 280 CB
威望: 240 点
在线时间: 74(时)
发自: Web Page
回 1楼() 的帖子
什么意思,没看明白。。。
级别: 新手上路
可可豆: 280 CB
威望: 240 点
在线时间: 74(时)
发自: Web Page
回 1楼() 的帖子
哦看明白了,原来是打字谐音的问题。试验了下,将obj2的-release后再赋值为nil,-isRelease确实无打印了,但我觉得这并不能说明obj2的retaincount已经为0被释放,因为obj2 = nil只是修改了该指针指向nil,那当然-isRelease无打印,因为将obj2的-release注释掉直接写obj2 = nil,同样无打印,但此时obj2毫无疑问是leak的;而obj2原指向的内存空间则被悬空了,不能确定原指向内存的obj2是否已被释放。
级别: 禁止发言
可可豆: 135 CB
威望: 135 点
在线时间: 0(时)
发自: Web Page
用户被禁言,该主题自动屏蔽!
级别: 新手上路
可可豆: 280 CB
威望: 240 点
在线时间: 74(时)
发自: Web Page
any body know?
关注本帖(如果有新回复会站内信通知您)
论坛技术问题应该发布到? 正确答案:CocoaChina问答
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 浏览移动版retain和release倒底怎么玩_百度知道
retain和release倒底怎么玩
我有更好的答案
1. 为什么会有retain? C++和Java不一样,Java有一套很方便的垃圾回收机制,当我们不需要使用某个对象时,给它赋予null值即可。而C++new了一个对象之后,不使用的时候通常需要delete掉。
于是,Cocos2d-x就发明了一套内存管理机制(小若:发你妹纸。。。),其实红孩儿的博客很详细地解释了Cocos2d-x的内存管理机制,我没有能力也不想重复解释。(小若:那你还写?= =)
Retain的意思是保持引用,也就是说,如果想保持某个对象的引用,避免它被Cocos2d-x释放,那就要调用对象的retain函数。(小若:为什么不retain就会被释放?)
2. 真正的凶手autoRelease 既然旁白诚心诚意地问我,那我就光明正大地回答吧(小若:我今天没力气吐槽,好吧= =)。
一旦调用对象的autoRelease函数,那么这个对象就被Cocos2d-...
其他类似问题
为您推荐:
release的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁ios&中测试retain,release,retainCount方法时注意关闭ARC
You have two options:
1) Turn off ARC for this project. This is done by
setting&'Objective-C
Automatic Reference
Counting'to&NO&in
the 'Build
Settings' tab of your target in the project page.
2) Remove all&retain&release&autorelease&NSAutoReleasePools&and&retainCount&calls,
since ARC makes them for you. With the exception
of&NSAutoReleasePools
They have been replaced by&@autorelease{}.
The second option has been automated by
关闭方法:
ARC是Objective-C中的垃圾回收机制,据说非常高效,但因为开启了ARC则不能显示调用dealloc/retain/release等手动内存管理操作,所以在很多情况下需要关闭。
目前XCode中有两种途径可以关闭ARC
创建项目时将ARC选项的勾取消掉
<img src="/blog7style/images/common/sg_trans.gif" real_src ="http://my.csdn.net/uploads//_7888.png" WIDTH="700" ALT="" STYLE="border-style: max-width: 100%;"
TITLE="ios&中测试retain,release,retainCount方法时注意关闭ARC" />
在开发中的项目在项目设置的build
setting中搜索garbage关键字就可以看到这个选项了,然后选择NO再次运行各种release就不会报警了
<img src="/blog7style/images/common/sg_trans.gif" real_src ="http://my.csdn.net/uploads//_1037.png" WIDTH="700" ALT="" STYLE="border-style: max-width: 100%;"
TITLE="ios&中测试retain,release,retainCount方法时注意关闭ARC" />
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 sas retain 的文章

 

随机推荐