2.3 cocos2d中的內(nèi)存管理問題
本節(jié)將針對(duì)內(nèi)存管理和自動(dòng)釋放消息的內(nèi)容進(jìn)行一些討論。
通常來(lái)說(shuō),當(dāng)在Objective-C中創(chuàng)建一個(gè)對(duì)象時(shí)會(huì)調(diào)用alloc方法。一旦調(diào)用alloc方法,就有責(zé)任在不再需要該對(duì)象時(shí)釋放它。以下代碼展示了最典型的alloc/init和release循環(huán):
// allocate a new instance of NSObject
NSObject* myObject = [[NSObject alloc] init];
// do something with myObject here ...
// release the memory used by myObject
// if you don't release it the object is leaked and the memory used by it
// is never freed.
[myObject release];
由于iOS應(yīng)用程序總是使用自動(dòng)釋放池,因此可以通過(guò)調(diào)用autorelease消息來(lái)避免發(fā)送release消息。下面是用autorelease重寫后的代碼示例:
// allocate a new instance of NSObject
NSObject* myObject = [[[NSObject alloc] init] autorelease];
// do something with myObject here ...
// no need to call release in fact you should not send release as it would crash
可見,autorelease的出現(xiàn)從某種意義來(lái)說(shuō)簡(jiǎn)化了內(nèi)存管理問題,因?yàn)槟阍僖膊恍枰浿l(fā)送release消息了。自動(dòng)釋放池為你做到了這一點(diǎn),它會(huì)在晚一些時(shí)候?qū)Τ刂械母鱾€(gè)對(duì)象發(fā)送release消息。而增加autorelease消息對(duì)創(chuàng)建對(duì)象來(lái)說(shuō),也只是增添了一點(diǎn)點(diǎn)復(fù)雜度而已。
請(qǐng)看以下代碼,它遵循常規(guī)風(fēng)格來(lái)創(chuàng)建和釋放CCNode對(duì)象:
// allocate a new instance of CCNode
CCNode* myNode = [[CCNode alloc] init]];
// do something with myNode ...
[myNode release];
大家普遍不傾向于使用這種創(chuàng)建cocos2d對(duì)象的方式。用靜態(tài)初始化方法更,而且將返回一個(gè)會(huì)被自動(dòng)釋放的對(duì)象。與蘋果官方推薦的方法相反,cocos2d對(duì)于autorelease的使用已經(jīng)內(nèi)置到了引擎的設(shè)計(jì)中:它把諸如[[[NSObject alloc] init] autorelease]等調(diào)用寫入了類的靜態(tài)方法中。這是一件好事!這種設(shè)計(jì)讓你不必再時(shí)刻盤算著哪些對(duì)象需要被釋放,它使你避免了由于過(guò)度釋放或內(nèi)存泄漏而導(dǎo)致的程序崩潰風(fēng)險(xiǎn)。
CCNode類的靜態(tài)初始化方法是“+(id) node”。以下代碼將向self發(fā)送alloc消息,,這等效于在CCNode的實(shí)現(xiàn)中調(diào)用[CCNode alloc]:
+(id) node {
return [[[self alloc] init] autorelease];
}
上面對(duì)self的調(diào)用方法更加普遍,而且對(duì)于C++程序員來(lái)說(shuō)應(yīng)該也更容易接受。
現(xiàn)在可以用靜態(tài)初始化方法來(lái)重寫CCNode的生成方法。不出所料,代碼變得很簡(jiǎn)潔:
// allocate a new instance of CCNode
CCNode* myNode = [CCNode node];
// do something with myNode …