iPhone NSCFString просачивается в fetchRequest - PullRequest
1 голос
/ 20 апреля 2010

В следующем коде:

- (NSMutableArray *) fetchNotesForGroup: (NSString *)groupName {

 // Variables declaration
 NSMutableArray *result;
 NSFetchRequest *fetchRequest;
 NSEntityDescription *entity;
 NSSortDescriptor *sortDescriptor;
 NSPredicate *searchPredicate;
 NSError *error = nil;

 // Creates the fetchRequest and executes it
 fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
entity = [NSEntityDescription entityForName:@"Note" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"noteName" ascending:YES] autorelease];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[fetchRequest setReturnsDistinctResults:YES];
searchPredicate = [NSPredicate predicateWithFormat:@"categoryName like %@", groupName];
[fetchRequest setPredicate:searchPredicate];
[fetchRequest setPropertiesToFetch:[NSArray arrayWithObject:@"noteName"]];
result = [[managedObjectContext executeFetchRequest:fetchRequest error:&error] mutableCopy];

 // Variables release

 return result;
}

... Я выбираю заметки для данной категории. Когда я запускаю Instruments, он говорит, что NSCFString протекает.

Я знаю, что утечки означают для разработчиков iPhone ... но я не знаю, как их подключить.

Есть какие-нибудь подсказки? Любая помощь приветствуется.

Большое спасибо!

Ответы [ 3 ]

1 голос
/ 20 апреля 2010

Ваша проблема заключается в следующем:

result = [[managedObjectContext executeFetchRequest:fetchRequest error:&error] mutableCopy];
// Variables release
return result;

mutableCopy возвращает ссылку-владельца (т. Е. Объект со счетом сохранения +1), который вы ответственны за (автоматическое) освобождение. Вы не делаете этого, а затем отказываетесь от ссылки, что означает, что вы утекли массив.

Используйте return [result autorelease]; вместо.

0 голосов
/ 20 апреля 2010

Поскольку вы не создаете никаких строк, текущая строка, скорее всего, является одной из строк, которая заканчивается в запросе выборки, и, скорее всего, запрос выборки действительно протекает. (Стек вызовов, показанный в приборах, должен это подтвердить.)

Я не думаю, что у вас есть настоящая утечка, но делая это:

 fetchRequest = [[[NSFetchRequest alloc] init] autorelease];

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

Авто-релиз фактически заставляет объекты жить дольше, чем прямое освобождение, потому что он заставляет объекты зависать до тех пор, пока не будет истощен внешний пул авто-выпуска. Например, если вы создаете объект-B внутри объекта-A и возвращаете его объекту-C с автоматическим освобождением, объект-B останется живым еще долго после освобождения объекта-A, даже если объект-C никогда не сохранит его. (Хотя в конечном итоге он умрет в непредсказуемый момент.)

Авторелиз не является удобным способом сохранения . У него есть определенная цель сохранения объектов, которые передаются между другими объектами. Если вы этого не делаете, не используйте autorelease.

Если вы сделаете это:

fetchRequest = [[NSFetchRequest alloc] init];
// ...
[fetchRequest release];

... ваша утечка исчезнет.

Возможно, вы захотите сделать это:

return [result autorelease];

... чтобы гарантировать, что результирующий массив живет достаточно долго, чтобы быть сохраненным другим объектом.

0 голосов
/ 20 апреля 2010

Прежде всего, инструменты могут быть не всегда точными.
Он может сообщать об утечках в некоторых особых случаях, просто потому, что не видит, что вы на самом деле освобождаете объект в другом месте.

Также возможно, что некоторые части CF имеют утечки.

В вашем коде я вижу, что вы используете автоматически высвобождаемые объекты.
Ваши временные объекты будут иметь долгий жизненный цикл.
Что добавить, если вы освободите их явно, прямо перед возвратом метода?

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

...