Cocos2d-x 的内存管理(7)

来源:未知 责任编辑:责任编辑 发表时间:2013-11-15 19:49 点击:

}
输出:
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并显示的代码如下:

发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • cocos2d-x学习笔记(19)--label 、label atlas
  • cocos2d-x学习笔记(23)--地图的使用3--CCTMXLayer
  • Cocos2d-x学习(一):HelloWorld
  • cocos2dx在xcode下开发,编译到android上(2)
  • cocos2d 设置屏幕默认方向
  • Cocos2d-x 2.0 之 Actions “三板斧” 之一
  • cocos2d-x学习笔记(22)--地图的使用2(TMX) --Z-Order、AnchorPoi
  • cocos2d-x学习笔记(18)--游戏打包(windows平台)
  • cocos2d-x学习笔记(16)--spritesheet(精灵表单)
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1