我有这样的Class方法:
+(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;
有什么想法吗?也许类mothod(+)是问题?
答案 0 :(得分:1)
您不应该依赖retainCount
属性。
它不是很可靠,因为你永远不知道幕后做了什么。
例如,当使用像NSString这样的类集群时,在NSString类内部完成了很多事情,retainCount对你来说没有实际意义。对于某些情况,如NSTimers&所以,RunLoop也发布了objets(当在这个runloop上安排时),但如果你不知道它,那不是一件容易的事......
显然这两个例子(类集群和runloop保留)不是你在这里的,但我在这里说的是 retainCount
属性不是你应该依赖的东西检查你是否有泄漏。
此外,如果为项目激活了垃圾收集器,release
是NO-OP(因为这是GC本身将管理和释放实例)
实际上,当您在项目中使用ARC时,Xcode4禁止使用retainCount
。
要检查代码是否有泄漏,请使用静态分析器(Xcode Build菜单中的“Build& Analyze”)和/或Instruments“Leaks”工具。