Это неплохо с точки зрения производительности, так как я бы не ожидал, что свойства будут инициализированы в замкнутом цикле в любом случае, но это можно сделать более эффективно, если у вас есть доступ к полю, используемому в качестве резервного хранилища для этого свойства.
- (void)anInitOrAccessorMethod
{
self.property = [[AClass alloc] init];
[self.property release];
}
Последовательность сохранения / разблокировки в этом случае следующая (как вы правильно описали):
alloc: retainCount = 1
retain: retainCount = 2 // (setter)
release: retainCount = 1
Если у вас есть доступ к резервному хранилищу (при условии, что iVar называется * 1007)*) вы можете отбрасывать ненужные вызовы reatin / release (вы тоже правильно упомянули):
- (void)anInitOrAccessorMethod
{
self.property_ = [[AClass alloc] init];
}
Поскольку установщик свойств не вызывается, retainCount останется равным 1, обеспечивая то же поведение, что и ваш код.
Но есть различие в поведении: прямой доступ к резервному хранилищу безопасен только для инициализации свойства (если раньше оно было nil
), поскольку установщик больше не может гарантировать, что предыдущее значение будет освобождено.до установки нового значения.
И с точки зрения производительности: сохранение / освобождение действительно не является дорогостоящей операцией.Отсутствие утечек памяти стоит гораздо больше, чем, возможно, «сохранение» вызова сохранения / освобождения.