1

Я пытаюсь разрешить утечку памяти, но я не могу найти решение.Утечка памяти при касании какао с mutableCopy

Instruments говорит, что есть утечка в этом методе:

- (void)refreshData { 

Sn0werSp33dAppDelegate *appDelegate = [[Sn0werSp33dAppDelegate alloc] init]; 
NSFetchRequest *coreDataNewsFetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"News" inManagedObjectContext:managedObjectContext]; 

[coreDataNewsFetchRequest setEntity:entity]; 

self.managedObjectContext = appDelegate.managedObjectContext; 
self.newsArray = [[managedObjectContext executeFetchRequest:coreDataNewsFetchRequest error:nil] mutableCopy];//Intruments says that here is the memory leak :(


[appDelegate release]; 
[coreDataNewsFetchRequest release]; 
[entity release]; 
} 

newsArray объявлен в моей .h как NSMutableArray и обладает свойством: @property (nonatomic, retain) NSMutableArray *newsArray;

Я пробовал много вещей, но во все времена это не работало. Я запускаю XCode 3.2.5 с iPhone SDK 4.2.1 и инструментами 2.7.

+0

Вы должны отформатировать свой код так, чтобы он читаемым. –

+0

можете ли вы немного отформатировать код? кроме того, можете ли вы сказать, какие инструменты говорят? Помните, что mutablecopy не делает глубокую копию массива! – Icky

+0

Он просто показывает мне один красный стек на одном синем. И правильно ли это форматирование кода? – AppleL1nk

ответ

12

Когда вы

self.newsArray = something; 

что something сохраняется, потому что вы добавили retain в newsArray собственности.

Но mutableCopy также возвращает объект с увеличенным счетчиком на 1. Таким образом, после завершения метода ваш newsArray имеет счетчик хранения, превышающий то, что вы действительно хотите, что является обнаруженной утечкой памяти.

Решение: Замените строку, в которой вы назначаете self.newsArray с

self.newsArray = [[[managedObjectContext executeFetchRequest:coreDataNewsFetchRequest error:nil] mutableCopy] autorelease]; 
+0

Ударьте меня к ней за секунды. :-) –

+0

Спасибо mrueg, я думал, что это не сработает, и поэтому я не пробовал. Еще раз спасибо: D – AppleL1nk

3

mutableCopy делает копию и сохраняет его, так что вам нужно, чтобы освободить экземпляр, который вы создали. Попробуйте изменить это:

self.newsArray = [[managedObjectContext executeFetchRequest:coreDataNewsFetchRequest 
                 error:nil] mutableCopy]; 

Для этого:

self.newsArray = [[[managedObjectContext executeFetchRequest:coreDataNewsFetchRequest 
                 error:nil] mutableCopy] autorelease]; 

Как и в сторону, создавая новый объект вашего класса приложения делегат немного необычно и не может дать вам результат вы ожидаете , Обычно инстанцировании одно приложение делегата (по умолчанию это делается для вас в MainWindow.xib), а затем обращаться к нему в течение вашего приложения с помощью:

FooAppDelegate *appDelegate = (FooAppDelegate*)[[UIApplication sharedApplication] delegate]; 
+0

Это уже дает мне результат, который я хочу, но мне нужно освободить appDelegate, и я не знаю, где его выпустить :( – AppleL1nk

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