initWithContentsOfFile像疯了一样泄漏

时间:2012-06-08 00:17:30

标签: objective-c instruments memory-leaks initwithcontentsoffile

我的应用程序是完全无泄漏的(我认为),但有一件事据说会泄漏很多。所以这就是:

    mainPath = [[NSBundle mainBundle] bundlePath];
    levelConfigPlistLocation = [mainPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.plist",CATEGORY]];
    levelConfig = [[NSDictionary alloc] initWithContentsOfFile:levelConfigPlistLocation];

以下是我如何使用它:

NSString *question = [[[levelConfig objectForKey:LEVELSETSTRING]objectForKey:LEVELSTRING]objectForKey:@"question"];

    questionLabel = [CCLabelTTF labelWithString:question dimensions:CGSizeMake(820.0f,360.0f) alignment:UITextAlignmentCenter fontName:@"helvetica" fontSize:32.0f];
    questionLabel.position = ccp(screenSize.width/2-30 ,screenSize.height);
    questionLabel.color = ccc3(255,255,255);
    [self addChild:questionLabel z:5];

NSString *answer = [[[levelConfig objectForKey:LEVELSETSTRING]objectForKey:LEVELSTRING]objectForKey:@"answer"];

    for (int i=0; i < [answer length]; i++) 
    { 
        NSRange r = NSMakeRange(i, 1);
        NSString *ichar = [answer substringWithRange:r]; 
        [characters addObject:ichar]; 
    }

而且,在-dealloc我释放它:

[levelConfig release];

仪器向我显示以下泄漏:

Screenshot Instruments

当我双击时,总是显示相同的行,即:

Screenshot Instruments 2

这显然是levelconfig的泄漏...但我该怎么办?

1 个答案:

答案 0 :(得分:1)

你直接访问你的ivars,你不应该这样做。如果您用self.levelConfig =...替换它,那么您的泄漏很可能会消失。

您在此处提供的特定代码块很可能是viewDidLoad或其他可以多次调用的地方。每次执行此操作时,您都会泄露levelConfig的旧内容。使用self.将解决这个问题。除initdealloc之外,请避免直接访问您的ivars。

相关问题