忽略保留属性,类方法
我一个类的方法是这样的:忽略保留属性,类方法
+(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;
任何想法?也许类方法(+)是问题吗?
您不应该依赖retainCount
属性。
这不是很可靠,因为你永远不知道幕后做了什么。
例如,当使用像NSString这样的类集群时,在NSString类中内部完成的事情太多了,因此retainCount对你来说不具有真正的意义。对于某些情况下,像这样的NSTimers &,OBJETS也由RunLoop(定于本runloop时)公布的,但如果你不知道,这是不平凡...
显然这两个例子(类集群和runloop保留)不是你在这里,但我在这里说的是retainCount
财产是不是你应该依靠检查是否有泄漏。
此外,如果您已经激活了您的项目垃圾收集,release
是NO-OP(因为这是将管理和释放实例的GC本身)
其实,使用retainCount
是在您的项目中使用ARC时禁止从Xcode4开始。
要检查代码中是否存在泄漏,请使用静态分析器(“Build & Analyze”from Xcode Build menu)和/或仪器“泄漏”工具。
静态分析仪我没有错误... 如果我评论[加载器发布]这一切都好,我没有泄漏,但我不明白为什么。 调用 [hudLayer.hudLoader retain]; [loader release]; 应该没问题,但它不是,它会崩溃。 – Chiodo
然后让它在僵尸仪器中崩溃并看到整个保留/释放堆栈。 – Alin
+1 Alin,好建议 – AliSoftware
这是什么意思的数据? hudLoader本身是失去了还是它的一个属性?如果它是一个财产,它保留了吗? – Alin
[loader loader] hudLoader指向死对象后。您可以通过代码看到hudLoader是一个保留的属性。 – Chiodo