CCLayer 在 init 中调用 schedual 方法后引用计数混乱的问题
来源:互联网 发布:公司软件oa 编辑:程序博客网 时间:2024/06/14 04:06
参考相关问题链接:
http://www.cocos2d-iphone.org/forum/topic/314
先上代码再解释:
RefferenceCountLayer.h
//// RefferenceCountLayer.h// HungryBear//// Created by Bruce Yang on 12-8-9.// Copyright (c) 2012年 EricGameStudio. All rights reserved.//#import "cocos2d.h"@interface RefferenceCountLayer : CCLayer@end
//// RefferenceCountLayer.mm// HungryBear//// Created by Bruce Yang on 12-8-9.// Copyright (c) 2012年 EricGameStudio. All rights reserved.//#import "RefferenceCountLayer.h"@implementation RefferenceCountLayer-(ccColor4B) randomBrightColor { while(true) { float requiredBrightness = 192; ccColor4B randomColor = ccc4(arc4random() % 255, arc4random() % 255, arc4random() % 255, 255); if (randomColor.r > requiredBrightness || randomColor.g > requiredBrightness || randomColor.b > requiredBrightness) { return randomColor; } }}-(id) init { if((self = [super init])) { self.isTouchEnabled = YES; ccColor4B color4B = [self randomBrightColor]; CCLayerColor* lyrColor = [CCLayerColor layerWithColor:color4B]; [self addChild:lyrColor]; NSLog(@"init() -> 1.RefferenceCount = %d", [self retainCount]); [self schedule:@selector(tick:)]; NSLog(@"init() -> 2.RefferenceCount = %d", [self retainCount]); } return self;}-(void) draw { NSLog(@"draw() -> RefferenceCount = %d", [self retainCount]);}-(void) tick:(ccTime)dt { NSLog(@"tick() -> RefferenceCount = %d", [self retainCount]);}-(void) ccTouchesBegan:(NSSet*)touches withEvent:(UIEvent*)event { NSLog(@"ccTouchesBegan()"); [[CCDirector sharedDirector] replaceScene:[RefferenceCountLayer node]];}-(void) dealloc { NSLog(@"ReffenceCountLayer.dealloc!"); [super dealloc];}@end
2012-08-09 00:41:55.733 WonderPipeEffects1[18926:707] init() -> 1.RefferenceCount = 12012-08-09 00:41:55.737 WonderPipeEffects1[18926:707] init() -> 2.RefferenceCount = 22012-08-09 00:41:55.741 WonderPipeEffects1[18926:707] tick() -> RefferenceCount = 42012-08-09 00:41:55.748 WonderPipeEffects1[18926:707] draw() -> RefferenceCount = 42012-08-09 00:41:55.753 WonderPipeEffects1[18926:707] tick() -> RefferenceCount = 42012-08-09 00:41:55.758 WonderPipeEffects1[18926:707] draw() -> RefferenceCount = 42012-08-09 00:41:55.769 WonderPipeEffects1[18926:707] tick() -> RefferenceCount = 42012-08-09 00:41:55.775 WonderPipeEffects1[18926:707] draw() -> RefferenceCount = 42012-08-09 00:41:55.785 WonderPipeEffects1[18926:707] tick() -> RefferenceCount = 42012-08-09 00:41:55.788 WonderPipeEffects1[18926:707] draw() -> RefferenceCount = 42012-08-09 00:41:55.803 WonderPipeEffects1[18926:707] tick() -> RefferenceCount = 42012-08-09 00:41:55.807 WonderPipeEffects1[18926:707] draw() -> RefferenceCount = 42012-08-09 00:41:55.818 WonderPipeEffects1[18926:707] tick() -> RefferenceCount = 42012-08-09 00:41:55.820 WonderPipeEffects1[18926:707] draw() -> RefferenceCount = 42012-08-09 00:41:55.836 WonderPipeEffects1[18926:707] tick() -> RefferenceCount = 42012-08-09 00:41:55.839 WonderPipeEffects1[18926:707] draw() -> RefferenceCount = 42012-08-09 00:41:55.852 WonderPipeEffects1[18926:707] tick() -> RefferenceCount = 42012-08-09 00:41:55.856 WonderPipeEffects1[18926:707] draw() -> RefferenceCount = 42012-08-09 00:41:55.869 WonderPipeEffects1[18926:707] tick() -> RefferenceCount = 42012-08-09 00:41:55.872 WonderPipeEffects1[18926:707] draw() -> RefferenceCount = 42012-08-09 00:41:55.886 WonderPipeEffects1[18926:707] tick() -> RefferenceCount = 42012-08-09 00:41:55.889 WonderPipeEffects1[18926:707] draw() -> RefferenceCount = 42012-08-09 00:41:55.907 WonderPipeEffects1[18926:707] tick() -> RefferenceCount = 42012-08-09 00:41:55.911 WonderPipeEffects1[18926:707] draw() -> RefferenceCount = 42012-08-09 00:41:55.917 WonderPipeEffects1[18926:707] ccTouchesBegan()2012-08-09 00:41:55.921 WonderPipeEffects1[18926:707] init() -> 1.RefferenceCount = 12012-08-09 00:41:55.925 WonderPipeEffects1[18926:707] init() -> 2.RefferenceCount = 22012-08-09 00:41:55.928 WonderPipeEffects1[18926:707] tick() -> RefferenceCount = 32012-08-09 00:41:55.932 WonderPipeEffects1[18926:707] ReffenceCountLayer.dealloc!2012-08-09 00:41:55.936 WonderPipeEffects1[18926:707] draw() -> RefferenceCount = 42012-08-09 00:41:55.940 WonderPipeEffects1[18926:707] tick() -> RefferenceCount = 42012-08-09 00:41:55.944 WonderPipeEffects1[18926:707] draw() -> RefferenceCount = 42012-08-09 00:41:55.952 WonderPipeEffects1[18926:707] tick() -> RefferenceCount = 42012-08-09 00:41:55.954 WonderPipeEffects1[18926:707] draw() -> RefferenceCount = 42012-08-09 00:41:55.970 WonderPipeEffects1[18926:707] tick() -> RefferenceCount = 42012-08-09 00:41:55.980 WonderPipeEffects1[18926:707] draw() -> RefferenceCount = 4
测试结论如下:
init 方法里面调用 schedual 方法以后,RefferenceCountLayer 的引用计数会加1,这里没有问题~
但是到了 draw()、tick() 方法里面,引用计数竟然由 2 直接跳到 4!
我是百思不得其解,不过经过我的测试,发现引用计数虽然直接跳到 4 了,
但是在 replaceScene 的时候,依然能够看到 RefferenceCountLayer 的 dealloc 方法被调用了,
也就是说,该对象并不会因此而出现什么内存泄露的问题~
后面我思考了一下,引用计数由 2 跳到 4 肯定是在 cocos2d 框架内部安全的增长到 4 的,
这个不用我们去操心,没有内存泄露,我们知道这样一件事情就行了~
前面附的链接里面 cocos2d 作者之一 Riq 没有就此问题做较为仔细的回复,这是问题的来源,
不过也不能去责怪他什么,人的精力毕竟是有限的,他不可能就每个问题都做详细的回复,
凡事都往好的方面想,Riq 作为 cocos2d 的主要负责人之一,为我们提供了这么 nice 的东西,这样便行了~
- CCLayer 在 init 中调用 schedual 方法后引用计数混乱的问题
- iOS中影响引用计数的方法
- 引用计数的问题
- 关于std::string的引用计数在多线程中产生的问题
- CCLayer::init()
- 重写了Servlet的init方法后一定要记得调用父类的init方法
- 重写了Servlet的init方法后一定要记得调用父类的init方法
- 一个即使在init方法中调用,也会保证onEnter之后执行的小技巧
- java中数据类型在方法调用后的变化
- 遇到问题---java---myeclipse中maven项目引用另一个导致的resource文件混乱的问题
- coco2d-x中引用离子效果,游戏计数的方法
- cocos2dx中层的初始化CCLayer::init()
- CCLayer initWithColor的问题
- 组件的引用计数问题
- python中对象引用计数的相关问题
- (java)对象引用向上转型后,无法调用子类独有的方法和属性问题
- viewDidLoad在init方法之前调用的坑
- 引用计数法的循环引用问题
- 1602动态显示字符--C语言版本
- xml转化成json对象
- EXCEL中如何撤销工作表保护
- Android应用开发以及设计思想深度剖析(1)
- android Gallery实现异步加载网络图片
- CCLayer 在 init 中调用 schedual 方法后引用计数混乱的问题
- 黑马程序员_Java基础_面向对象(异常2、练习题、导包)
- Linux下socket编程
- 对话框(3)之调用Windows函数调色板
- mini6410编译tslib
- java优先队列
- Web App或夭折,Hybrid App才是新世界的王
- TCP协议的一些要点知识
- 常见网络营销方法总结