Cocos2d-x 的内存管理(7)
}
输出:
2013-04-08 01:40:27.580 test_objc_mem[4734:303] 21: -[Obj init]
2013-04-08 01:40:27.582 test_objc_mem[4734:303] 38: Test, retain_count:1
2013-04-08 01:40:27.583 test_objc_mem[4734:303] 42: Test, retain_count:2
2013-04-08 01:40:27.583 test_objc_mem[4734:303] 45: Test, retain_count:1
2013-04-08 01:40:27.583 test_objc_mem[4734:303] 29: -[Obj dealloc]
42行代码输出的retain_count等于2, 就是因为array宣示了一次所有权.
内存池
在objc中, 还常用autoreleasepool来解决前面提到的C/C++语言内存管理的问题. 大部分情况下, objc都不是用C语言那种外部分配内存, 内部使用的方式, 而是用autorelease统一的管理. 见下例:
#import <Foundation/Foundation.h>
@interface Obj : NSObject {
}
- (id) init;
@end
@implementation Obj
- (id) init {
self = [super init];
if (self) {
NSLog(@"%d: %s", __LINE__, __FUNCTION__);
return self;
}
return nil;
}
+ (id) create {
NSLog(@"%d: %s", __LINE__, __FUNCTION__);
return [[[Obj alloc] init] autorelease];
}
- (void)dealloc {
NSLog(@"%d: %s", __LINE__, __FUNCTION__);
[super dealloc];
}
@end
void Test() {
@autoreleasepool {
id test = [Obj create];
NSLog(@"%d: %s, retain_count:%d", __LINE__, __FUNCTION__, [test retainCount]);
id array = [[NSMutableArray alloc] init];
[array addObject:test];
NSLog(@"%d: %s, retain_count:%d", __LINE__, __FUNCTION__, [test retainCount]);
[array release];
}
NSLog(@"%d: %s", __LINE__, __FUNCTION__);
}
注意与上例纯引用计数的区别, 这里的Obj由自己提供的类方法create提供, 创建后直接调用autorelease, 然后外部就没有如上例一样的release了, 虽然create出来的retain count还是等于1.
这里可以把autorelease pool看成一个能宣示所有权的容器, 而autorelease函数就是一个简化的操作, 本质上就是将对象Add到这个容器中. 并且Objc提供了一些语法糖来简单的初始化和释放该容器. 仅此而已.
ARC(Automatic Reference Counting)
在新版的Objc语言中支持了一种叫做ARC的新特性, 可以在编译时期为程序员自动的匹配retain和release, 有类似自动内存管理的方便, 同时不影响内存使用的效率, 程序员本身也不会因为少些了release而导致内存泄漏, 相当强大.
Cocos2d-x的内存管理
要是完全没有接触过Objc, 只是了解C++, 看到cocos2d-x的内存管理设计, 会想说脏话的. 了解objc的话, 起码还能理解cocos2d-x的开发者是尝试在C++中模拟Objc的内存管理方式. 不仅仅是说加引用计数而已, 因为真要在C++中加引用计数的方法有很多种, cocos2d-x用的这种方法, 实在太不原生态了.
简单情况
因为cocos2d-x中牵涉到显示的情况最多, 我也就不拿CCArray这种东西做例子了, 看个CCSprite的例子吧, 用cocos2d-x的XCode template生成的HelloWorld工程中, 删除原来的显示代码, 创建一个Sprite并显示的代码如下:
相关新闻>>
- 发表评论
-
- 最新评论 更多>>