Какао / ObjC: Есть ли какие-либо недостатки в производительности в моем стиле выделения объектов для свойства iVars? - PullRequest
1 голос
/ 24 июля 2010

Я использую свойства почти всегда, когда моим классам нужны iVars.Для сохраненных свойств я привык к определенному способу использования методов доступа для выделения / инициализации фактических iVars:

- (void)anInitOrAccessorMethod
{
  self.property = [[AClass alloc] init];
  [self.property release];
}

Каждый раз, когда мне нужно установить iVar без автоматического выпуска, я использую вышеуказанный стильустановить свойство (которое сохраняет объект), а затем отправить ему сообщение об освобождении для смещения alloc + retain.Это контрастирует со многими примерами кода сообщества, которые я вижу, когда люди просто устанавливают iVars напрямую, если объект создается с использованием alloc / create, таким образом исключая дополнительный выпуск.

Помимо дополнительных накладных расходов на код, есть линедостатки производительности в моем стиле?

Ответы [ 3 ]

3 голосов
/ 24 июля 2010

Не делайте этого. Если ваше свойство объявлено как имеющее семантику copy, ваш код пропустит первый объект и перевыпустит второй.

0 голосов
/ 24 июля 2010

Снижение производительности, вероятно, незначительно, если предположить, что ваши средства доступа не имеют дорогостоящих побочных эффектов, но это приводит к тому, что в -init не следует использовать средства доступаВы хотите избежать ошибок от методов доступа, которые делают предположения о состоянии объекта.

0 голосов
/ 24 июля 2010

Это неплохо с точки зрения производительности, так как я бы не ожидал, что свойства будут инициализированы в замкнутом цикле в любом случае, но это можно сделать более эффективно, если у вас есть доступ к полю, используемому в качестве резервного хранилища для этого свойства.

- (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), поскольку установщик больше не может гарантировать, что предыдущее значение будет освобождено.до установки нового значения.

И с точки зрения производительности: сохранение / освобождение действительно не является дорогостоящей операцией.Отсутствие утечек памяти стоит гораздо больше, чем, возможно, «сохранение» вызова сохранения / освобождения.

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