忽略保留属性,类方法

问题描述:

我一个类的方法是这样的:忽略保留属性,类方法

+(CCScene *) sceneWithMovie:(NSString*)movieName level:(NSString*)levelName hudLevel:(NSString*)hudName 
{ 

    bbsScene* scene = (bbsScene*)[super sceneWithMovie:movieName level:levelName]; 
    ScenePage* hudLayer = (ScenePage*)scene.layer; 

    UTLOG(@"---> %p RETAIN COUNT: %d",hudLayer.hudLoader,[hudLayer.hudLoader retainCount]); 

    TouchLevelHelperLoader* loader = [[TouchLevelHelperLoader alloc]initWithContentOfFile:hudName]; 
    hudLayer.hudLoader = loader; 

    UTLOG(@"---> %p RETAIN COUNT: %d",hudLayer.hudLoader,[hudLayer.hudLoader retainCount]); 

    [loader release]; 

    UTLOG(@"---> %p RETAIN COUNT: %d",hudLayer.hudLoader,[hudLayer.hudLoader retainCount]); 

    [hudLayer.hudLoader addSpritesToLayer:hudLayer]; 
    NSInteger sceneNumber = [[[[self class]description] stringByReplacingOccurrencesOfString:@"Scene" withString:@""]intValue]; 
    [hudLayer loadTextPage:sceneNumber fromFile:SCENE_TEXT_FILE]; 

    // return the scene 
    return scene; 
} 

输出是:

2011-09-22 10:53:28.477 MP NO VID[598:207] ---> 0x0 RETAIN COUNT: 0 
2011-09-22 10:53:28.490 MP NO VID[598:207] ---> 0x64af820 RETAIN COUNT: 2 
2011-09-22 10:53:28.491 MP NO VID[598:207] ---> 0x64af820 RETAIN COUNT: 2 

当我释放加载程序的数据丢失,如果我不调用hudLayer.hudLoader = loader; 显然我设置了:

@property(nonatomic,retain)TouchLevelHelperLoader* hudLoader; 

任何想法?也许类方法(+)是问题吗?

+0

这是什么意思的数据? hudLoader本身是失去了还是它的一个属性?如果它是一个财产,它保留了吗? – Alin

+0

[loader loader] hudLoader指向死对象后。您可以通过代码看到hudLoader是一个保留的属性。 – Chiodo

不应该依赖retainCount属性

这不是很可靠,因为你永远不知道幕后做了什么。

例如,当使用像NSString这样的类集群时,在NSString类中内部完成的事情太多了,因此retainCount对你来说不具有真正的意义。对于某些情况下,像这样的NSTimers &,OBJETS也由RunLoop(定于本runloop时)公布的,但如果你不知道,这是不平凡...

显然这两个例子(类集群和runloop保留)不是你在这里,但我在这里说的是retainCount财产是不是你应该依靠检查是否有泄漏

此外,如果您已经激活了您的项目垃圾收集,release是NO-OP(因为这是将管理和释放实例的GC本身)

其实,使用retainCount是在您的项目中使用ARC时禁止从Xcode4开始。

要检查代码中是否存在泄漏,请使用静态分析器(“Build & Analyze”from Xcode Build menu)和/或仪器“泄漏”工具。

+0

静态分析仪我没有错误... 如果我评论[加载器发布]这一切都好,我没有泄漏,但我不明白为什么。 调用 [hudLayer.hudLoader retain]; [loader release]; 应该没问题,但它不是,它会崩溃。 – Chiodo

+1

然后让它在僵尸仪器中崩溃并看到整个保留/释放堆栈。 – Alin

+0

+1 Alin,好建议 – AliSoftware