忽略了Class方法中的retain属性

时间:2011-09-22 09:05:03

标签: iphone objective-c

我有这样的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(+)是问题?

1 个答案:

答案 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”工具。