這就是使用自動釋放對象的妙處。你不必再記著給對象發(fā)送釋放信息。每一次cocos2d進入下一幀那些不再使用的自動釋放對象將被自動地釋放。但這樣做也有一個缺點:如果使用上述代碼,然后在下一幀或者以后想要訪問 myNode對象時你就會發(fā)現(xiàn)它已經(jīng)不在內(nèi)存中了。如果這時發(fā)送消息給它,將導(dǎo)致程序出現(xiàn)EXC_BAD_ACCESS錯誤而崩潰。
簡單地把CCNode* myNode變量當(dāng)作類成員變量并不意味著對象使用的內(nèi)存會被自動保留下來。如果想在下一幀或者以后的幀中訪問自動釋放對象,就必須保留它。并且,如果沒有顯式地將其添加它為子節(jié)點,之后還是要對其進行手動釋放。
有一個種方法可以更好地使用自動釋放對象的方法,并且不需要顯式地調(diào)用retain方法:你:可以將生成的CCNode對象作為子節(jié)點添加到另一個派生自CCNode 的對象中,甚至可以刪除成員變量,而直接依賴cocos2d來保存對象:
// 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
}