Objective c initWithContentsOfFile正在疯狂地泄漏

Objective c initWithContentsOfFile正在疯狂地泄漏,objective-c,instruments,memory-leaks,initwithcontentsoffile,Objective C,Instruments,Memory Leaks,Initwithcontentsoffile,我的应用程序是完全无泄漏的(我想),但有一件事应该是泄漏了很多。这就是: mainPath = [[NSBundle mainBundle] bundlePath]; levelConfigPlistLocation = [mainPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.plist",CATEGORY]]; levelConfig = [[NSDictionary alloc]

我的应用程序是完全无泄漏的(我想),但有一件事应该是泄漏了很多。这就是:

    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];
以及:

仪器显示以下泄漏:

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


这显然是levelconfig的泄漏。。。但是我能做什么呢

您正在直接访问IVAR,这是不应该做的。如果您将其替换为
self.levelConfig=…
,则很可能您的泄漏会消失


您在此处提供的特定代码块很可能位于类似于
viewDidLoad
的位置,或者可以多次调用的其他位置。每次这样做,都会泄漏
levelConfig
的旧内容。使用
self.
可以解决这个问题。除非在
init
dealoc
中,否则避免直接访问IVAR。好的,直接访问IVAR是合适的,甚至建议在init方法和
-dealoc
中使用。不清楚那条线是从哪里来的。如果不是从init方法,那么,是的,它应该使用访问器来确保在重新分配变量之前释放
levelConfig
指向的任何以前的对象。同意。正如我所说的“除了在
init
dealoc
中之外”,您已经将所有ivar访问切换到访问器(除了在init和dealoc中)?我不会只在这个地方做。一致使用访问器是避免此类头痛的绝对最佳方法。当然,你还需要审核你使用levelConfig的每个地方。如果每次有人声称他们的应用程序没有泄漏,我就有一美元……)
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]; 
    }
[levelConfig release];