#iphone #objective-c #cocoa-touch #uiview
#iPhone #objective-c #cocoa-touch #uiview
Вопрос:
Вопрос новичка: Я пытаюсь удалить вложенный просмотр после добавления его в представление, а затем его освобождения, т. Е. у меня есть:
for (int i = 0; i < 9, i ) {
UIButton *btn = [indexButtons objectAtIndex:i];
btn.tag = x;
[notePage1 addSubview:btn];
[btn release];
}
Как я могу избавиться от одного из этих btn, например, номера 0? Я подумал о
UIButton *btn = [indexButtons objectAtIndex:0];
if ([btn isDescendantOfView:notePage1]) { [btn removeFromSuperview]; }
[btn release];
Но это просто приведет к сбою приложения. Я вообще не получаю журнал ошибок? — приложение просто завершает работу. Как мне сделать это правильно?
Ответ №1:
Вы не должны отпускать кнопку, потому что вы ее не выделяли.
Все дело в праве собственности на объект. Вы никогда не должны выпускать объект, который вам не принадлежит. Вы можете стать владельцем объекта, отправив одно из следующих сообщений:
- выделить
- новое
- сохранить
- Копировать
Комментарии:
1. Спасибо! Но в противном случае, это был бы правильный путь к решению этой проблемы, не так ли? Или есть более элегантный способ?
2. Это нормально, до тех пор, пока вы не освобождаете объекты, которые вы не выделяли
3. «вы также не копировали и не сохраняли это» также должно быть в ответе, чтобы сделать его полным.
Ответ №2:
Вы не должны отпускать кнопку ни в одном из этих фрагментов. Вы используете только release
, retain
если вы специально использовали alloc
, copy
, new
или,,,.
Ваш код должен быть:
for (int i = 0; i < 9, i ) {
UIButton *btn = [indexButtons objectAtIndex:i];
btn.tag = x;
[notePage1 addSubview:btn];
}
и
UIButton *btn = [indexButtons objectAtIndex:0];
if ([btn isDescendantOfView:notePage1]) { [btn removeFromSuperview]; }
Добавление в a к супервизору автоматически увеличивает количество сохранений и автоматически удаляет выпуски. Вам не нужно ни о чем беспокоиться.
Комментарии:
1. Спасибо! О, дорогой, я должен был знать это … спасибо, что напомнил мне — надеюсь, на этот раз я запомню!
Ответ №3:
не отпускайте кнопки, вы их никогда не выделяли