2011-01-19 2 views
0

Я знаю, что это должно быть что-то простое, что я с видом, но почему это протечки:NSAutoreleasePool протечки

//add a pool for this since it is on its own thread 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

//add the image 
NSURL * imageURL = [NSURL URLWithString:[recipeData objectForKey:@"imagePath"]]; 
NSData * imageData = [NSData dataWithContentsOfURL:imageURL]; 
UIImage * image = [UIImage imageWithData:imageData]; 
UIImageView * myImageView = [[UIImageView alloc] initWithImage:image]; 

//resize to make it fit the screen space 
CGRect frame = myImageView.frame; 
frame.size.width = 320; 
frame.size.height = 357; 
myImageView.frame = frame; 

[self.view addSubview:myImageView]; 


[activity stopAnimating]; 

[pool drain]; 
[self placeItems]; 

Я получаю ошибку:

_NSAutoreleaseNoPool(): Object 0x4e2fdf0 класса NSPathStore2 autoreleased с нет пула на месте - просто утечка

Я попытался переместить место размещения [pool drain], но ничего не сделал. Я вижу много кода, который выглядит так же, как при поиске в Google причины.

Благодарим за помощь.

+1

Вы просачиваете 'myImageView' (его нужно освободить). Другое то, что на первый взгляд все выглядит прекрасно. – kubi

ответ

2

Слив пула приводит к освобождению и последующему освобождению от него, так как autoreleasepool не могут быть сохранены. Я подозреваю, что должна быть некоторая потребность в autoreleasepool в placeItems (или в другом месте, вызванном после [pool drain]), так как в этот момент пул уже ушел.

Итак, вы можете попробовать прокомментировать сообщение об утечке, чтобы убедиться, что утечка исчезнет.

+0

Это исправлено. Я просто получаю предупреждение «Неиспользуемый пул переменных» –

+0

Я согласен со всем, кроме части про комментирование утечки пула. Слив пула авторезистов всегда должен быть конечной линией в методе. – Brian

+0

Я только предложил прокомментировать сообщение об утечке как быстрый способ уладить проблему - следующим шагом было бы найти лучшее место для нее. Как и вы предложили, последняя строка метода будет кандидатом для такого места :) – Toastor

2

Много вещей, чтобы сказать здесь:

  • первый, вы протечки myImageView. Вы должны выпустить его после -addSubview.
  • следующий, так как вы находитесь в другом потоке, ваш [улей бассейна] должен быть в конце
  • последний, так как вы не в основном потоке, вы не можете выполнять какую-либо операцию пользовательского интерфейса. Попытайтесь заменить [self.view addSubview:myImageView] на [self.view performSelectorOnMainThread:@selector(addSubview:) withObject:myImageView waitUntilDone:YES]. То же самое с [activity stopAnimating].

И как сказал Брайан, сообщение -drain должно быть в конце вашего потока.

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