#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.