正文

入 门(13)

iPhone & iPad Cocos2D游戏开发实战 作者:(美)伊特海姆


  

2.3  cocos2d中的内存管理问题

本节将针对内存管理和自动释放消息的内容进行一些讨论。

通常来说,当在Objective-C中创建一个对象时会调用alloc方法。一旦调用alloc方法,就有责任在不再需要该对象时释放它。以下代码展示了最典型的alloc/init和release循环:

// 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应用程序总是使用自动释放池,因此可以通过调用autorelease消息来避免发送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的出现从某种意义来说简化了内存管理问题,因为你再也不需要记着发送release消息了。自动释放池为你做到了这一点,它会在晚一些时候对池中的各个对象发送release消息。而增加autorelease消息对创建对象来说,也只是增添了一点点复杂度而已。

请看以下代码,它遵循常规风格创建和释放CCNode对象:

// allocate a new instance of CCNode

CCNode* myNode = [[CCNode alloc] init]];

// do something with myNode ...

[myNode release];

大家普遍不倾向于使用这种创建cocos2d对象的方式。用静态初始化方法更,而且将返回一个会被自动释放的对象。与苹果官方推荐的方法相反,cocos2d对于autorelease的使用已经内置到了引擎的设计中:它把诸如[[[NSObject alloc] init] autorelease]等调用写入了类的静态方法中。这是一件好事!这种设计让你不必再时刻盘算着哪些对象需要被释放,它使你避免了由于过度释放或内存泄漏而导致的程序崩溃风险。

CCNode类的静态初始化方法是“+(id) node”。以下代码将向self发送alloc消息,这等效于在CCNode的实现中调用[CCNode alloc]:

+(id) node {

return [[[self alloc] init] autorelease];

}

上面对self的调用方法更加普遍,而且对于C++程序员来说应该也更容易接受。

现在可以用静态初始化方法来重写CCNode的生成方法。不出所料,代码变得很简洁:

// allocate a new instance of CCNode

CCNode* myNode = [CCNode node];

// do something with myNode …


上一章目录下一章

Copyright © 读书网 www.dushu.com 2005-2020, All Rights Reserved.
鄂ICP备15019699号 鄂公网安备 42010302001612号