xcode Instruments - 找不到泄漏
Posted
技术标签:
【中文标题】xcode Instruments - 找不到泄漏【英文标题】:xcode Instruments - can't find leak 【发布时间】:2013-02-12 15:40:58 【问题描述】:我遇到了一个真正让我头疼的问题。
所以基本上我有一个 MainMenuScene,它反过来创建一个测试层。该层非常简单,因为它只创建一个乐谱标签和一个添加到菜单的按钮。 当按下此按钮时,MainMenuScene 会被空白场景替换,然后 MainMenuScene 会再次加载。
到目前为止一切顺利。然而问题是,当我每次重新加载场景时在仪器中进行堆放时,堆增加了大约 20kb。当我在扩展视图中深入挖掘时,似乎 testLayer 中的精灵和字体没有被释放,但正在调用层中的 dealloc 方法。
我还为我的文件添加了 ARC 支持,除了核心 Cocos 文件。这有什么关系吗?
这里是测试层:
@implementation TestLayer
-(id)init
self = [super initWithColor:ccc4(2,2,2,210)];
if (self != nil)
// ask director the the window size
CGSize s = [[CCDirector sharedDirector] winSize];
self.isTouchEnabled = YES;
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.numberStyle = NSNumberFormatterDecimalStyle;
NSNumber * n = [NSNumber numberWithInt:[SDCloudUserDefaults integerForKey:@"highscore"]];
NSString *string = [formatter stringFromNumber:n];
//score
CCLabelBMFont * scoreLabel = [CCLabelBMFont labelWithString:string fntFile:@"scoreFont.fnt" width:s.width alignment:kCCTextAlignmentCenter];
scoreLabel.position = ccp( POS_X(443), POS_Y(877) );
[self addChild:scoreLabel z:90];
//PLAY BUTTON
CCMenuItemSprite *playButton = [CCMenuItemSprite itemFromNormalSprite:[CCSprite spriteWithFile:@"play_up.png"]
selectedSprite:[CCSprite spriteWithFile:@"play_down.png"]
target:self
selector:@selector(Transition:)];
playButton.position = ccp( POS_X(380) , POS_Y(177));
menu = [CCMenu menuWithItems: playButton, nil];
menu.position = ccp(0, 0);
[self addChild: menu];
return self;
-(void) Transition:(ccTime) dt
[self unschedule:@selector(Transition:)];
[[SceneManager sharedSceneManager]RunSceneWithID:SCENE_LOADING:eCCTransitionCrossFade:1.0f];
- (void) dealloc
NSLog(@"%s",__FUNCTION__);
@end
我真的看不出这有什么问题。
谢谢
【问题讨论】:
是什么促使您进行优化?你遇到内存崩溃了吗?对我来说,20K 的堆射差异听起来并不多。这只是过早的优化吗?我可以理解,记忆的增长让你感到困扰。它也会困扰我,但这是一个问题吗? @Matt Long 大小只有 20kb,因为是一个小的测试层。如果我使用原始层,泄漏量约为 400kb :( 【参考方案1】:是的,我对一个 unARCed 项目进行了相同的测试,对 [super dealloc] 等的所有正确调用都正确,并且得到了完全相同的行为。
但是,经过仔细检查,我仍然不确定我是否有泄漏,或者我没有正确解释结果。
所以我有一个初始状态的程序,并采取了一个 heapshot。然后我按下 ui 按钮,使场景被替换然后重新加载。我回到初始状态并拍摄另一个堆,并注意到堆增长了大约 20kb 左右。当我再次按下 ui 按钮时,前一个 heapshot 回到零字节。这样做几次后,之前的 heapshot 总是回到零字节。
因为在 cocos2d 中,每次替换场景时,附加到该场景的所有内容都会被释放,而当您回到该场景时,所有内容都会重新分配。所以我认为总会有一个堆增长,因为增长是场景的大小,该层作为一个孩子。这有意义吗?
我还注意到,每次我这样做时,统计信息中的#Living 列都没有增加,这是一个好兆头,对吧?
【讨论】:
以上是关于xcode Instruments - 找不到泄漏的主要内容,如果未能解决你的问题,请参考以下文章
instruments无法连接,设备查询不到,找不到工程,查询不到对应app