Правильный способ освободить представления, хранящиеся в NSMutableArray? - PullRequest
0 голосов
/ 20 февраля 2012

Моя программа добавляет на экран неограниченное количество просмотров (определяемых пользователем во время выполнения), и я отслеживаю эти представления, сохраняя их в массиве.

Внутри моего контроллера просмотра

for (NSString *equationText in equationData) {

// creates a FormulaLabel object for every object in the equationData mutable array 

FormulaLabel *tempLabel = [[FormulaLabel alloc] initWithFrame:CGRectMake(frame)];
[view addSubview:tempLabel];
[balanceItems addObject:tempLabel];  //balance items keeps track of all the views

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

Для этого подхода (насколько я знаю) мне нужно удалить представления из суперпредставления, освободить их и удалить объекты, хранящиеся в balanceItems. Затем мне нужно инициализировать новые представления, добавить их в подпредставление и добавить их в массив. Однако приведенный ниже код создает ошибку.

for (UIView *view in balanceItems) {

    [view removeFromSuperview];
    [view release];
}

[balanceItems removeAllObjects];

Как правильно удалить представления из суперпредставления и массива?

1 Ответ

0 голосов
/ 20 февраля 2012

Во-первых, вы должны правильно освободить представления при их создании:

FormulaLabel *tempLabel = [[FormulaLabel alloc] initWithFrame:CGRectMake(frame)]; // retain count is 1
[view addSubview:tempLabel]; // retain count is 2
[balanceItems addObject:tempLabel]; // retain count is 3
[tempLabel relase]; // retain count is 2

Вы должны освободить tempLabel, потому что вы получили его методом init, поэтому вы владеете им.

Затем, когда вы удалите представления;вам не нужно вызывать release:

for (UIView *view in balanceItems) {
    [view removeFromSuperview]; // retain count is 1
}
[balanceItems removeAllObjects]; // retain count is 0 => view gets deallocated

, поскольку в настоящее время сохраняется только представление, но только представление super и массив, поэтому он будет освобожден, когда вы удалите его из них.

...