Обнаружение утечки памяти / источника проблем с избыточным выпуском - PullRequest
1 голос
/ 18 мая 2011

Может кто-нибудь помочь мне понять, где я должен выпускать exerciseArray? Я получаю сбой в dealloc и когда выпускаю перед вызовом sortedArray. Этот код вызывается много раз.

//Set exerciseArray
review.exerciseArray = [[workout assignedExercises] allObjects];

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSLog(@"viewWillAppear");
    NSString *workoutName =  [event.assignedWorkout valueForKey:@"name"];
    self.title = workoutName ;

    NSSortDescriptor *sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"index"
                                                                    ascending:YES] autorelease];
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
    [sortedArray release];
    sortedArray= [exerciseArray sortedArrayUsingDescriptors:sortDescriptors];
    NSLog(@"*****SORTEDARRAY****** %d",[sortedArray retainCount]);
    for (Exercise *ex in sortedArray){
        NSLog(@"%@ %@ %@",ex.name , ex.repCount, ex.weight);
    } 
    NSLog(@"*********************");
    [sortedArray retain];
    [self.tableView reloadData];
}

 - (void)dealloc {
    [super dealloc];

    [managedObjectContext release];
    [event release];
}

1 Ответ

3 голосов
/ 18 мая 2011

Перво-наперво: вы должны переместить вызов [super dealloc] в конец вашего dealloc метода. Сначала обработайте свои пользовательские переменные, а затем последнее, что вы делаете, это подталкиваете dealloc к суперклассу для обработки остальной части очистки.


Теперь я беспокоюсь о [sortedArray release] и [sortedArray retain] там. Чтобы сохранить семантику реализации retain / release на вашем sortedArray ivar, вы должны объявить свойство для sortedArray следующим образом:

// this goes in your @interface
@property (nonatomic, retain) NSArray *sortedArray;

// this goes in your @implementation
@synthesize sortedArray;

Теперь вы можете легко установить sortedArray, не беспокоясь о сохранении или отпускании:

// note the use of self, this is required
self.sortedArray = [exerciseArray sortedArrayUsingDescriptors:sortDescriptors];

Теперь вы можете удалить вызовы release и retain, поскольку они обрабатываются автоматически. Обязательно добавьте строку в ваш метод dealloc, чтобы очистить переменную тоже.

self.sortedArray = nil;

.. который вызовет release для вашего массива.

РЕДАКТИРОВАТЬ: Это также относится к упражнению ArrayArray, который был вашим реальным вопросом. Везде, где задействован класс Cocoa, вы можете упростить управление памятью, используя @property (retain) и @synthesize. Для NSInteger и других примитивных типов, или если вы не хотите хранить ссылку на объект, принадлежащую ему, используйте @property (assign).

...