iOS Core Data - неожиданная утечка памяти - PullRequest
0 голосов
/ 26 мая 2011

У меня есть многопоточная настройка данных ядра - она ​​работает очень хорошо.В этой настройке у меня есть ряд функций, которые собирают необходимые данные и так далее.Все они работают хорошо, за исключением этой, которая вызывает небольшую утечку - но она складывается довольно быстро и приводит к сбою приложения.

- (id)getRecordOfType:(NSString *)type WithCode:(NSString *)codeString{
    id returnObj = nil;

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:[NSEntityDescription entityForName:type inManagedObjectContext:self.managedObjectContext]];

    NSPredicate *categoryPred = [NSPredicate predicateWithFormat:[@"code='" stringByAppendingFormat:@"%@'", codeString]];
    [request setPredicate:categoryPred];
    categoryPred = nil;

    if (![request entity]) {
        [request release]; request = nil;
        return nil;
    }

    NSError *error;
    NSMutableArray *results = [[self.managedObjectContext executeFetchRequest:request error:&error] mutableCopy];

    for (id tmpObj in results) {
        if([(NSString *)[tmpObj code] isEqualToString:codeString])
            returnObj = tmpObj;
            break;
    }

    [results release];
    [request release];

return returnObj;
}

Если кто-то сможет пролить здесь немного света, это будет очень признательно.

Заранее спасибо,

Майкл

1 Ответ

0 голосов
/ 26 мая 2011

Я не могу легко обнаружить утечку памяти. С другой стороны, я думаю, что утечка памяти не всегда является причиной сбоя, только если у вас заканчивается память. Во всяком случае, мне кажется, что есть проблема с вашим кодом, который может вызвать сбой:

из результатов,

    NSMutableArray *results = [[self.managedObjectContext executeFetchRequest:request error:&error] mutableCopy];

Вы выбираете объект:

           returnObj = tmpObj;

и вернуть его после публикации результатов:

[results release];
...
return returnObj;

Насколько я понимаю, освобождение массива также освободит весь его объект, поэтому вы возвращаете объект, который может быть освобожден в любой момент (или даже просто освобожден).

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