2010-07-14 4 views
2

Мне очень нужна помощь с утечкой памяти в приложении для iPhone. Приложение готово к отправке в магазин приложений, стабильно, не имеет утечек памяти вообще в iPhone-симуляторе или Clang ... но кажется пронизанным ими на моем iPod Touch.Core Data Memory Leak - iPhone iOS4

Все они, похоже, связаны с managedObjectModel, когда я пытаюсь получить данные из Core Data.

Код основных данных в моем приложении был автоматически создан Xcode некоторое время назад, я заметил, что код с тех пор изменился, когда вы получили xcode для его создания ... Я пробовал со старым и новым, но это не имеет значения.

Если я прокомментирую следующий код, проблема исчезнет ... может в любом случае понять, что с ним не так? Я потратил 9 часов на это до сих пор и просто не могу понять это!

NSString *entityForName = [[NSString alloc] initWithString:@"OfflineSettings"]; 

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

[entityForName release]; 

NSSortDescriptor *sortById = [[NSSortDescriptor alloc] initWithKey:@"Id" ascending:YES]; 
[request setSortDescriptors:[NSArray arrayWithObject:sortById]]; 
[sortById release]; 

NSError *error; 
NSMutableArray *mutableFetchResults = [[[self managedObjectContext] executeFetchRequest:request error:&error] mutableCopy]; 
if (mutableFetchResults == nil) { 
    // Handle the error. 
    NSLog(@"Error fetching"); 
} 

int intId = -1; 

if ([mutableFetchResults count] == 0) { 
    TTDERROR(@"No id has been saved to offline settings");  
} else {  
    OfflineSettings *offlineSettings = (OfflineSettings *)[mutableFetchResults objectAtIndex:0];   
    intId = [offlineSettings.Id intValue]; 
} 

[mutableFetchResults release]; 
[request release]; 

Течь специально, кажется, на этой линии:

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

.. и код для [само] managedObjectContext является следующим в случае помогает ..

- (NSManagedObjectContext *)managedObjectContext { 

    if (managedObjectContext_ != nil) { 
     return managedObjectContext_; 
    } 

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
    if (coordinator != nil) { 
     managedObjectContext_ = [[NSManagedObjectContext alloc] init]; 
     [managedObjectContext_ setPersistentStoreCoordinator:coordinator]; 
    } 
    return managedObjectContext_; 
} 

Я действительно в недоумении, поэтому я был бы так благодарен за помощь!

Steven

+0

Я не вижу, как эта линия вызывает утечку, но почему вы делаете изменчивую копию? Вы не изменяете массив вообще, просто получите доступ к нему, а затем отпустите его. Кроме того, как вы обнаруживаете утечки на iPod, но не в симуляторе? – bobDevil

+0

Привет, Мутируемый Копи был в образце кода, из которого я первоначально скопировал это. Я пробовал это без и избавляюсь от сопровождающего релиза, но это не помогает. Я обнаруживаю утечки на iPod с помощью инструментов. Спасибо, –

ответ

1

Вам не нужна изменяемая копия. executeFetchRequest: возвращает автореализованный статический массив, и вы не мутируете массив. (Я все время вижу это. Должен быть в каком-то примере). Аналогично, создание NSString entityForName бессмысленно. Просто поставьте строковый литерал в entityForName:, чтобы устранить еще один возможный источник ошибки.

Niether из них является вероятным источником утечки, но вы все равно должны их удалить.

Как правило, если у вас есть проблемы на устройстве, но не на симуляторе или на одном оборудовании, а не на других, проблема возникает в библиотеке/структуре, которая неправильно скомпилирована для аппаратного обеспечения, где возникает ошибка. Там действительно нет какой-либо ошибки кодера, которая протекает в одной среде, но не в других. Когда мы делаем ошибку, она универсальна.

Также возможно, что такие ресурсы, как изображения и звуки, ведут себя по-другому, поскольку разные устройства используют разные графические и аудио-аппаратные средства. Это, однако, довольно редко.

Если вы запустите код через «Инструменты», он должен точно указать, какой объект протекает.

+0

Я тоже видел материал 'mutableCopy'. Надеюсь, один из нас выследит его источник, потому что он такой же глупый, как и кастинг, который я все время вижу. –

+0

Хорошо, спасибо TechZen ... это тот совет, который мне нравится, окончательный! i.e «На самом деле нет какой-либо ошибки кодера, которая протекает в одной среде, но не в других.Когда мы ошибаемся, это универсально ». Так что, если моя логика, так как мой код работает без утечки памяти в симуляторе, то я не ошибся в кодировке. Не могли бы вы вообще разобраться по правильному или неправильному способ скомпилировать фреймворки для устройств iPhone/iPod? ... и/или как определить, когда некорректно скомпилирована одна из фреймворков/библиотек, используемых в вашем проекте? В miunute мой проект использует несколько рамок/библиотек Еще раз спасибо –

+0

О, и я запускаю код с помощью инструментов, вот как я знаю, что у меня есть утечка ... Leaked Object: GeneralBlock4096 Ответственная библиотека: Foundation Ответственный Оправа: NSPushAutoreleasePool .. и если я смотрю в расширенной детализации, это приводит к тому: [AppDelegate managedObjectContext] [AppDelegate persistentStoreCoordinator] [AppDelegate managedObjectModel] –