#iphone #objective-c #memory-leaks
#iPhone #objective-c #утечки памяти
Вопрос:
Я получаю утечку памяти в следующей строке кода:
Строка кода:
NSArray *fetchedObjects = [qContext executeFetchRequest:fetchRequest error:amp;error];
Я пытался ознакомиться с этим и пытался найти причину этого в течение довольно долгого времени, но безуспешно.
Может кто-нибудь подсказать мне, где искать? …и правильно ли я понимаю «100%», что это указывает на то, что эта строка кода на 100% вызывает утечку?
Обновить
Еще немного кода:
//=========PREPARE CORE DATA DB===========//
if (managedObjectContext == nil) { managedObjectContext = [(FamQuiz_R0_1AppDelegate *)
[[UIApplication sharedApplication] delegate] managedObjectContext]; }
// Define qContext
NSManagedObjectContext *qContext = [self managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"questions" inManagedObjectContext:qContext];
[fetchRequest setEntity:entity];
NSArray *fetchedObjects = [qContext executeFetchRequest:fetchRequest error:amp;error];
for (NSManagedObject *info in fetchedObjects) {
if ([[info valueForKey:@"qDiff"] intValue] == 1) {
[allEasyArrayQ addObject:[info valueForKey:@"idQ"]];
} else if ([[info valueForKey:@"qDiff"] intValue] == 2) {
[allMediumArrayQ addObject:[info valueForKey:@"idQ"]];
} else if ([[info valueForKey:@"qDiff"] intValue] == 3) {
[allHardArrayQ addObject:[info valueForKey:@"idQ"]];
}
}
Комментарии:
1. Можете ли вы показать, как вы создаете fetchrequest и предикат?
2. Также предоставьте подробную информацию об утечке, если можете.
3. Освобождается ли объект fetchRequest (он автоматически освобождается или- освобождается вручную после выполнения fetchRequest?
4. Выпущен запрос выборки
Ответ №1:
Вероятно, вы чрезмерно сохраняете массив или объекты внутри него позже в этом методе или даже за пределами этого метода. Строка будет указывать только, где создаются объекты, а не где выполняется фактическое дополнительное сохранение. Для этого вам нужно будет проверить с помощью инструментов, которые стеки вызовов сохраняют и освобождают пропущенные объекты.
Ответ №2:
Нет, 100% означает, что на эту утечку приходится 100% вашей утекшей памяти (т. Е. Это ваша единственная утечка).
Обратите внимание, если вы хотите устранить утечку, вы ищете не в том месте. Утечки сообщают вам, какой экземпляр является утечкой, это класс и это история управления памятью. Попробуйте учебник, подобный этомуhttp://www.cimgf.com/2008/04/02/cocoa-tutorial-fixing-memory-leaks-with-instruments /
Обратите внимание, что Утечки не могут указать вам строку, где происходит утечка, поскольку причиной вашей утечки является то, чего вы не сделали, в отличие от того, что вы сделали (т. Е. вы не выпустили свой объект).