Я только начинаю узнавать о правильном освобождении объектов для управления памятью в 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, но как я могу узнать, что это происходит. Если он будет передан по ссылке, у меня возникнут проблемы, не так ли? Может кто-нибудь прояснить, что здесь происходит и почему выпуск объекта является законным? Большое спасибо.

0
Ryan 29 Авг 2011 в 19:02

3 ответа

Лучший ответ

Это потому, что rightBarButtonItem был объявлен retained. (См. Документация по UINavigationItem )

Когда вы объявляете собственность сохраненной:

@property(nonatomic, retain) UIBarButtonItem *rightBarButtonItem

Вы говорите, что когда вы измените его значение aNavItem.rightBarButtonItem = aNewItem, вы отправите сообщение [aNewItem retain].

Поэтому вы можете безопасно освободить его после (поскольку он сохраняется в rightBarButtonItem)

Для получения дополнительной информации я настоятельно рекомендую вам заглядывать (ежемесячно, чтобы привыкнуть к этому, пока это не станет второй натурой) на Документация Apple по управлению памятью

5
apouche 29 Авг 2011 в 15:07

Когда он присваивается rightBarButtonItem, он сохраняется. Важно помнить, что освобождение не «избавляет от объекта» - оно просто уменьшает счетчик удержания. Только когда счетчик сохранения достигает 0, объект освобождается.

В этом случае, когда вы назначаете элемент для rightBarButtonItem, его счетчик сохранения увеличивается до 2. Затем, когда вы его отпускаете, счетчик сохранения уменьшается до 1. Когда контроллер навигации уходит, он переходит в 0 (а затем ваш товар будет освобожден).

Это работает до тех пор, пока это свойство типа сохраняет:

@property(nonatomic, retain) UIBarButtonItem *rightBarButtonItem

Вы можете посмотреть на заголовок API, чтобы определить, какой тип свойства вы назначаете.

2
dtuckernet 29 Авг 2011 в 15:10

Ключевым моментом здесь, Райан, является то, что rightBarButtonItem сохраняет объект, который в нем хранится.

Ответ выше неплохой. Единственное, что я хотел бы добавить, это то, что вы также можете посмотреть документацию, в которой описано свойство, и там написано @property (неатомный, сохранить). Итак, если вам неудобно читать файлы заголовков, это также есть в документации.

0
Mike Hay 29 Авг 2011 в 15:11