這就是使用自動(dòng)釋放對(duì)象的妙處。你不必再記著給對(duì)象發(fā)送釋放信息。每一次cocos2d進(jìn)入下一幀那些不再使用的自動(dòng)釋放對(duì)象將被自動(dòng)地釋放。但這樣做也有一個(gè)缺點(diǎn):如果使用上述代碼,然后在下一幀或者以后想要訪問 myNode對(duì)象時(shí)你就會(huì)發(fā)現(xiàn)它已經(jīng)不在內(nèi)存中了。如果這時(shí)發(fā)送消息給它,將導(dǎo)致程序出現(xiàn)EXC_BAD_ACCESS錯(cuò)誤而崩潰。
簡(jiǎn)單地把CCNode* myNode變量當(dāng)作類成員變量并不意味著對(duì)象使用的內(nèi)存會(huì)被自動(dòng)保留下來。如果想在下一幀或者以后的幀中訪問自動(dòng)釋放對(duì)象,就必須保留它。并且,如果沒有顯式地將其添加它為子節(jié)點(diǎn),之后還是要對(duì)其進(jìn)行手動(dòng)釋放。
有一個(gè)種方法可以更好地使用自動(dòng)釋放對(duì)象的方法,并且不需要顯式地調(diào)用retain方法:你:可以將生成的CCNode對(duì)象作為子節(jié)點(diǎn)添加到另一個(gè)派生自CCNode 的對(duì)象中,甚至可以刪除成員變量,而直接依賴cocos2d來保存對(duì)象:
// creating an autorelease instance of CCNode
-(void) init
{
myNode = [CCNode node];
myNode.tag = 123;
// adding the node as children to self (assuming self is derived from CCNode)
[self addChild:myNode];
}
-(void) update:(ccTime)delta
{
// later access and use the myNode object again
CCNode* myNode = [self getChildByTag:123];
// do something with myNode
}