Почему я получаю *** _NSAutoreleaseNoPool (): объект 0x97480b0 класса NSCFDictionary автоматически освобожден без пула на месте - просто утечка - PullRequest
0 голосов
/ 12 мая 2010

Я отметил несколько других тем на эту тему и попытался обернуть мой многопоточный код: NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; [релиз пула];

но ошибки все еще приходят.

Я использую статический метод для создания словаря слов. Вот некоторый код:

    -(id)init
     [NSThread detachNewThreadSelector:@selector(loadDictionary:) toTarget:[IntroScreen class] withObject:nil];
     [NSThread setThreadPriority:1.0];
     return self;
    }

    +(void)loadDictionary:(id)param
    {
     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
     [[SimpleAudioEngine sharedEngine] preloadEffect:@"click.wav"];
     [[SimpleAudioEngine sharedEngine] preloadEffect:@"pop.wav"];
     [[SimpleAudioEngine sharedEngine] preloadEffect:@"dink.wav"];
     [[SimpleAudioEngine sharedEngine] playBackgroundMusic:@"musicloop.wav"];
     [WordDictionary configDictionary];
     [pool release];
    }

+(void)configDictionary
{
 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
 Serializer * mySerializer = [[Serializer alloc] init];

 [WordDictionary setDictionary:[mySerializer readApplicationPlist:@"x"]];
 NSString * string;
 NSString *filePath = [[[NSBundle mainBundle] resourcePath] 
        stringByAppendingPathComponent:@"x.txt"];
 NSString *info = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
 NSArray *arrayOfLines = [info componentsSeparatedByString:@"\r\n"];
 [WordDictionary setDictionary:[[NSMutableDictionary alloc] init]];
 [NSMutableDictionary dictionaryWithContentsOfFile:filePath];
 int len = [arrayOfLines count];
 for(int i = 0; i < len; i++)
 {
  string = [arrayOfLines objectAtIndex:i];
  NSString * blankString = [NSString stringWithString:@""];
  [[WordDictionary dictionary] setObject:blankString forKey:string];
  double calc = ((double)i / (double)len) * 100.0;
  [WordDictionary setProgress:(int)calc];
 }

 [mySerializer writeApplicationPlist:[WordDictionary dictionary] toFile:@"s"]; 
 [WordDictionary setProgress:100];
 [pool release];
}

Что я должен знать об использовании методов статического класса с новыми потоками селектора?

Спасибо за вашу помощь

Ответы [ 2 ]

3 голосов
/ 12 мая 2010

Во-первых, в Objective-C нет статических методов. Есть методы класса.

Во-вторых, в вашем коде показаны оба метода, заключенные в пулы автоматического выпуска. Предупреждение должно быть откуда-то еще.

Наконец, ваш код просачивается как сито. Вы не следуете правилам управления памятью. И там есть несколько глупых утверждений.

В частности:

[WordDictionary setDictionary:[[NSMutableDictionary alloc] init]];

Если +setDictionary: не нарушает правила управления памятью, вышеупомянутые утечки.

Это утверждение [NSMutableDictionary dictionaryWithContentsOfFile:filePath]; фактически ничего не делает, если вы ничего не делаете с возвращаемым значением.

Также mySerializer протекает.

Попробуйте запустить анализатор над вашим кодом и устранить проблему. Вы также должны прочитать это и это .

0 голосов
/ 13 мая 2010

А [NSMutableDictionary dictionaryWithContentsOfFile:filePath]; был частью эксперимента, который я пытался сделать доступ к словарю быстрее. Я должен был удалить это из этого примера.

Я только что прочитал правила управления памятью и понял, что [WordDictionary setDictionary:[[NSMutableDictionary alloc] init]]; представляется плохо спланированным экземпляром, потому что у меня нет возможности выпустить его из configDictionary, так как ссылка потеряна. Но на самом деле я никогда не хочу выпускать его, он живет всю жизнь моего приложения. Вероятно, плохая практика точно так же.

mySerializer обязательно должен быть выпущен внизу.

Мне просто интересно, есть ли у методов класса какие-либо особые правила, касающиеся пулов авто-релиза и памяти.

Я посмотрю документы, которые вы мне отправили, и попробую разобраться с анализатором, спасибо за вашу помощь.

...