0

Мое приложение полностью негерметично (я думаю), но есть одна вещь, которая, предположительно, протекает очень много. Так вот: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 ... но что Я делаю ?

+2

Если бы у меня был доллар за каждый раз, когда кто-то утверждал, что их приложение не было утечки ....;) – bbum

ответ

1

Вы получаете прямой доступ к своим иварам, чего не следует делать. Если вы замените это на self.levelConfig =..., то, скорее всего, ваши утечки исчезнут.

Скорее всего, конкретный блок кода, который вы указали здесь, находится где-то вроде viewDidLoad или в другом месте, которое можно назвать несколько раз. Каждый раз, когда вы это делаете, вы пропускаете старое содержимое levelConfig. С помощью self. это исправит. Избегайте прямого доступа к вашим иварам, за исключением init и dealloc.

+0

Ну, прямой доступ к ivars подходит и даже рекомендуется в методе init и в '-dealloc'. Неясно, откуда эта строка вызывается. Если не из метода init, то да, он должен использовать аксессоров, чтобы убедиться, что любой предыдущий объект, на который указывает 'levelConfig', освобождается до переназначения переменной. –

+0

Согласовано. Как я заметил «за исключением« init »и' dealloc'. –

+0

Спасибо за ваш ответ, но эти утечки все еще там. Человек, это утомительно ... –

Смежные вопросы