Как мне правильно удалить вложенный просмотр?

#iphone #objective-c

#iPhone #objective-c

Вопрос:

У меня проблема с моим приложением, код для которого слишком длинный, чтобы вдаваться в подробности, но достаточно сказать, что когда я удаляю UIView и заменяю его новым, вот так:

 NSLog(@" .. %@", (Icon *)[self viewWithTag:index]);
Icon *icon = (Icon *)[self viewWithTag:index];
CGRect frame = icon.frame;
int tag = icon.tag;
[icon removeFromSuperview];
[icon release];

Icon *icon2 = [[Icon alloc] init];
icon2.frame = frame;
[icon2 makeIconStandardWithTag:(int)tag];
[self addSubview:icon2];
  

Это делает какую-то странную вещь, когда этот NSLog в первый раз (потому что представление уже есть) показывает, что объект является значком, но второй раз после запуска этого кода показывает, что по какой-то причине теперь это UIImageView, и он отображает то, что, как я предполагаю, является исходным значком в каком-то нечетном положении на экране. Это очень неустойчивое поведение. Но что я действительно знаю, так это:

Удаление строки [icon removeFromSuperview];, хотя объект остается там, останавливает это поведение и заставляет NSLog возвращать значок, как и должно быть.

Итак, я предполагаю, что он неправильно удаляет значок. Есть ли способ полностью удалить значок, или это removeFromSuperview, насколько я могу. Что я мог бы сделать, так это просто установить для него значение alpha = 0, но это скорее решение для исправления, а не то, как я хочу его решить.

Ответ №1:

«Есть ли способ полностью удалить значок, или removeFromSuperview — это все, что я могу сделать»

Вы можете присвоить объекту значение nil:

 icon = nil;
  

Комментарии:

1. Спасибо. Хотя это не решило мою проблему (проблема как-то связана с удалением его из superview), это продвинуло меня на шаг вперед.

2. Это просто предотвращает непреднамеренную отправку сообщения ненулевому, но выпущенному объекту. Это полезно в средах сбора мусора, но не приводит к преждевременному освобождению объекта в iOS.

Ответ №2:

Можете ли вы проверить, что такое «self» в этой строке кода: это может быть не то, что вы думаете.

   [self addSubview:icon2];
  NSLog(@" Self is %@", self);
  

Комментарии:

1. Self — это то, чем оно должно быть. Хотя спасибо за предложение.

Ответ №3:

Это предположение, но попробуйте установить self.tag значение -1 или какое-либо другое значение, которое не противоречит тегам, которые вы устанавливаете для своих Icon объектов. viewWithTag: Метод выполняет поиск соответствия в текущем представлении и его вложенных представлениях, поэтому, если self.tag == 0 и вы вызовете [self viewWithTag:0] , вы получите self .

Комментарии:

1. Пробовал это. Также каждому вложенному просмотру присваивается тег, равный -1, иначе я уверен, что один из них с первого раза выглядел бы как viewwithtag. Хотя, возможно, первый viewwithtag с 0 — это мой первый значок, но поскольку второй значок новый, что-то еще равно 0. Жаль, что я не могу получить список всего, что равно 0, я думал, что все остальное я сделал равным -1.

Ответ №4:

Сохраняли ли вы значок где-нибудь до этого? Если нет, нет необходимости освобождать его после вызова removeFromSuperview. Аналогично, если вам не нужна ссылка на icon2 в другом месте, вы можете удалить ее после вызова addSubview .

Представления сохраняют просмотры, добавленные через addSubview, и они освобождают просмотры, удаленные через removeFromSuperview.