Почему это законный выпуск объекта?(Управление памятью iOS) - PullRequest
0 голосов
/ 29 августа 2011

Я только начинаю узнавать о правильном освобождении объектов для управления памятью в 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 был создан (alloc). Теперь для него установлено свойство rightBarButtonItem в следующей строке:

self.navigationItem.rightBarButtonItem = item; 

Сразу после этой строки предмет отпускается.

[item release]; 

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

Ответы [ 3 ]

5 голосов
/ 29 августа 2011

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

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

@property(nonatomic, retain) UIBarButtonItem *rightBarButtonItem

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

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

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

2 голосов
/ 29 августа 2011

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

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

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

@property(nonatomic, retain) UIBarButtonItem *rightBarButtonItem

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

0 голосов
/ 29 августа 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...