Почему я получаю *** _NSAutoreleaseNoPool(): объект 0x97480b0 класса NSCFDictionary автоматически освобожден без пула на месте - просто утечка
Я отметил несколько других тем на эту тему и попытался обернуть мой многопоточный код следующим образом: 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 ответа
Во-первых, в Objective-C нет статических методов. Есть классовые методы.
Во-вторых, в вашем коде показаны оба метода, заключенные в пулы автоматического выпуска. Предупреждение должно быть откуда-то еще.
Наконец, ваш код просачивается как сито. Вы не следуете правилам управления памятью. И там есть несколько глупых утверждений.
В частности:
[WordDictionary setDictionary:[[NSMutableDictionary alloc] init]];
Если не +setDictionary:
нарушает правила управления памятью, вышеупомянутые утечки.
Это утверждение [NSMutableDictionary dictionaryWithContentsOfFile:filePath];
эффективно ничего не делает, если вы не делаете что-то с возвращаемым значением.
Также, mySerializer
подтекает
Попробуйте запустить анализатор над вашим кодом и устранить проблему. Вы также должны прочитать это и это.
Ах [NSMutableDictionary dictionaryWithContentsOfFile:filePath];
был частью эксперимента, который я пытался сделать доступ к словарю быстрее. Я должен был удалить это из этого примера.
Я только что прочитал правила управления памятью и понял, что [WordDictionary setDictionary:[[NSMutableDictionary alloc] init]];
кажется, плохо спланированная инстанция, потому что у меня нет возможности выпустить ее изнутри configDictionary
как ссылка потеряна. Но на самом деле я никогда не хочу выпускать его, он живет всю жизнь моего приложения. Вероятно, плохая практика точно так же.
mySerializer
обязательно должен быть выпущен внизу.
Мне было просто интересно, есть ли у методов класса какие-то особые правила, касающиеся пулов авто-релиза и памяти.
Я посмотрю документы, которые вы мне прислали, и попробую разобраться с анализатором, спасибо за вашу помощь.