Утечка памяти ядра данных - iPhone iOS4 - PullRequest
2 голосов
/ 14 июля 2010

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

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

Код 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];

.. и код для [selfagedObjectContext] выглядит следующим образом на случай, если это поможет ..

- (NSManagedObjectContext *)managedObjectContext {

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

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

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

Стивен

1 Ответ

1 голос
/ 14 июля 2010

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

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

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

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

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

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