Проблема утечки Objective-C - PullRequest
       21

Проблема утечки Objective-C

0 голосов
/ 23 марта 2011

Согласно инструментам, у меня есть утечки в коде ниже.Любой хороший человек, который может дать мне несколько советов и объяснений, почему я получаю указания на эти строки?

Следующие строки помечены как утечки:

NSMutableArray *read_Question = [[NSMutableArray alloc] initWithCapacity: 0];

NSArray *fetchedObjects = [qContext executeFetchRequest:fetchRequest error:&error];

if ([[info valueForKey:@"idQ"] intValue] == questionNr) { 
        [read_Question addObject:[info valueForKey:@"question"]];

Итак, вот полный код:

- (NSMutableArray *)readQuestion: (int)questionNr {

NSMutableArray *read_Question = [[NSMutableArray alloc] initWithCapacity: 0];

NSError *error;
//=========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:&error];
for (NSManagedObject *info in fetchedObjects) {
    if ([[info valueForKey:@"idQ"] intValue] == questionNr) { 
        [read_Question addObject:[info valueForKey:@"question"]];
        [read_Question addObject:[info valueForKey:@"qRightAnswer"]];
        [read_Question addObject:[info valueForKey:@"qWrongAnswer1"]];
        [read_Question addObject:[info valueForKey:@"qWrongAnswer2"]];
    }
}   
[fetchRequest release];
[read_Question autorelease];

return read_Question;
}

Ответы [ 2 ]

1 голос
/ 23 марта 2011

Вот где расположены объекты, но не там, где они просочились.Инструменты могут определить, когда объект выделен, и где он хранится и освобождается, но он не знает, какой релиз соответствует тому, который хранится, поэтому он приписывает утечку первоначальному распределению.

Найдите, где эти объекты используются,В Инструментах есть представление для отображения истории блока, но вам, вероятно, лучше подумать об этом.Какой код сохраняет эти объекты?Можете ли вы доказать, что один и тот же код выпускает их во всех случаях?

0 голосов
/ 23 марта 2011

Вы выполняете автоматическое освобождение внутри пула автоматического выпуска?т.е. вы создали экземпляр NSAutoreleasePool в потоке, вызывающем -read_Question?Я предполагаю, что это вызывается в главном потоке, и ваш файл main.m по умолчанию будет выглядеть так:

int main(int argc, char* argv[]) {
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool drain];
    return retVal;
}

Я не думаю, что это ваша проблема, но без полной информацииЯ все равно скажу так: если -read_Question вызывается в другом потоке, вам нужно что-то похожее:

NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
    .
    .
    .
[self read_Question];
    .
    .
    .
[pool drain];

В противном случае см. Предложение @ Steven!

...