Я только начинаю узнавать о правильном освобождении объектов для управления памятью в iOS. Мой самый большой вопрос основан на приведенном ниже коде.
- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"My View Controller";
UIBarButtonItem *item = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemAdd
target:self
action:@selector(doSomething)];
self.navigationItem.rightBarButtonItem = item;
[item release];
}
Хорошо, я вижу, что UIBarButtonItem был создан (выделен). Теперь для него установлено свойство rightBarButtonItem
в следующей строке:
self.navigationItem.rightBarButtonItem = item;
Сразу после этой строки выпускается предмет.
[item release];
Я предполагаю, что элемент скопирован в rightBarButtonItem, но как я могу узнать, что это происходит. Если он будет передан по ссылке, у меня возникнут проблемы, не так ли? Может кто-нибудь прояснить, что здесь происходит и почему выпуск объекта является законным? Большое спасибо.
3 ответа
Это потому, что rightBarButtonItem
был объявлен retained
. (См. Документация по UINavigationItem )
Когда вы объявляете собственность сохраненной:
@property(nonatomic, retain) UIBarButtonItem *rightBarButtonItem
Вы говорите, что когда вы измените его значение aNavItem.rightBarButtonItem = aNewItem
, вы отправите сообщение [aNewItem retain]
.
Поэтому вы можете безопасно освободить его после (поскольку он сохраняется в rightBarButtonItem
)
Для получения дополнительной информации я настоятельно рекомендую вам заглядывать (ежемесячно, чтобы привыкнуть к этому, пока это не станет второй натурой) на Документация Apple по управлению памятью
Когда он присваивается rightBarButtonItem, он сохраняется. Важно помнить, что освобождение не «избавляет от объекта» - оно просто уменьшает счетчик удержания. Только когда счетчик сохранения достигает 0, объект освобождается.
В этом случае, когда вы назначаете элемент для rightBarButtonItem, его счетчик сохранения увеличивается до 2. Затем, когда вы его отпускаете, счетчик сохранения уменьшается до 1. Когда контроллер навигации уходит, он переходит в 0 (а затем ваш товар будет освобожден).
Это работает до тех пор, пока это свойство типа сохраняет:
@property(nonatomic, retain) UIBarButtonItem *rightBarButtonItem
Вы можете посмотреть на заголовок API, чтобы определить, какой тип свойства вы назначаете.
Ключевым моментом здесь, Райан, является то, что rightBarButtonItem сохраняет объект, который в нем хранится.
Ответ выше неплохой. Единственное, что я хотел бы добавить, это то, что вы также можете посмотреть документацию, в которой описано свойство, и там написано @property (неатомный, сохранить). Итак, если вам неудобно читать файлы заголовков, это также есть в документации.
Похожие вопросы
Новые вопросы
ios
iOS - мобильная операционная система, работающая на Apple iPhone, iPod touch и iPad. Используйте этот тег [ios] для вопросов, связанных с программированием на платформе iOS. Используйте связанные теги [target-c] и [swift] для проблем, характерных для этих языков программирования.