Когда я использую Intrument Leak Tool, я получил утечку объекта NSCFString, но я не знаю, где это не так - PullRequest
1 голос
/ 20 апреля 2011
+ (NSArray*) queryAllByEntityName:(NSString*) name AndSortColumn:(NSString*) ptyName{
//Define our entity to use
NSEntityDescription *entity = [NSEntityDescription entityForName:name inManagedObjectContext:managedObjectContext];

//Setup the Fetch Request
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entity];

//Define How we will sort the result
if (ptyName != nil) {
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:ptyName ascending:NO];
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
    [request setSortDescriptors:sortDescriptors];
    [sortDescriptor release];
}


//Fetch the record and Handle the error
NSError *error;
NSArray *FetchResults = [managedObjectContext executeFetchRequest:request error:&error];
[request release];
if (!FetchResults) {
    //Handle the Error
}

//Save our fetched Data to a array
return [[FetchResults copy] autorelease];}

Раньше я был программистом Java, поэтому я все еще незнаком с управлением памятью. Я знаю, что должен вернуть объект автоматического выпуска, и я сделал это. Или у моей функции core-data есть проблемы кроме NSCFString? THx за ответ!

1 Ответ

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

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

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

Не используйте alloc - init, когда сработает метод автоматического освобождения. Итак, это:

if (ptyName != nil) {
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:ptyName ascending:NO];
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
    [request setSortDescriptors:sortDescriptors];
    [sortDescriptor release];
}

... будет более кратко и безопасно написано:

if (ptyName != nil) {
    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:ptyName ascending:NO];
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
    [request setSortDescriptors:sortDescriptors];
}

Копирование возвращенного массива не требуется, как и авто-релиз. Итак, это:

return [[FetchResults copy] autorelease];}

... должно быть так:

return fetchResults;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...