Переменная поля утечки памяти - PullRequest
0 голосов
/ 18 мая 2011

Я не понимаю, почему я не могу просто добавить [sortedArray release]; в конце этого метода. Каждый раз, когда я это делаю, он падает.

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

// Sort ExerciseArray
int y = 0;
int x= 0;
do{
    if ([[[exerciseArray objectAtIndex:y] index]intValue] == x){
        [sortedArray addObject:[exerciseArray objectAtIndex:y] ];
        x++;
        }
        if (y<[exerciseArray count]-1){
                y++;
            }else {
                y=0;
            }

}
while(x <= [exerciseArray count]-1);

exerciseArray = sortedArray;
[self.tableView reloadData];

}

Если кто-то может указать мне правильное направление или направить меня к какой-либо документации, это будет очень цениться.

Ответы [ 2 ]

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

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

Число сохраненных объектов массива равно 1 при первом вызове alloc. Когда вы присваиваете его упражнению ArrayArray, его значение сохранения остается равным 1. Затем, когда вы освобождаете его, его число хранения падает до 0, и вы не можете ожидать, что снова получите доступ к массиву.

Вы не должны освобождать его (мои предпочтения), либо явно сохранять его, вызывая:

[exerciseArray release];
exerciseArray = [sortedArray retain];
[sortedArray release];

Обратите внимание на порядок этих двух сообщений. Первая строка освобождает любой существующий объект, на который указывает переменная exerciseArray. Вторая строка увеличивает счетчик сохранения нового массива до 2, а вторая затем сбрасывает его до 1, поэтому массив все еще сохраняется. Если вы отпустите sortedArray до назначения нового массива переменной exerciseArray, счетчик сохранения станет равным 0, и вы потеряете его, прежде чем сможете присвоить его новой переменной.

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

Вы, вероятно, хотели сделать:


[exerciseArray release];
exerciseArray = sortedArray;
[self.tableView reloadData];

Кстати, вы можете отсортировать массив, используя блок с sortedArrayUsingComparator.

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