2011-12-13 2 views
2

Возможно, я слишком быстро вскочил в Objective-C и предположил, что я достаточно хорошо знал об управлении памятью, чтобы погрузиться. Оказывается, я не был.Как установить значение свойства в Objective-C на правильном пути

Ускоренная перемотка вперед, и я догнал ... по большей части. Один из моих последних оставшихся вопросов касается процесса @ property/@ synhesize и правильной настройки этих значений.

Я часто видел это:

SomeObject *obj = [[SomeObject alloc] init]; 
self.obj = obj; 
[obj release]; 

Это имеет смысл, но мне интересно, если это выполняет достаточно подобную вещь, чтобы быть альтернативой:

self.obj = [[[SomeObject alloc] init] autorelease]; 

ли это быть приемлемым в любом месте может установить значение @property, obj? Или прямой доступ к переменной экземпляра, предпочтительной для обоих из методов init?

obj = [[SomeObject alloc] init]; 

Thanks.

EDIT: Определенно связанный question, который обсуждает половину моего вопроса. Часть моего вопроса упоминается в одном из ответов, но не подтверждена.

Так мои вопросы по-прежнему остаются:

  1. Является autorelease реальной альтернативой в этой ситуации?
  2. Могут ли использоваться autorelease в методе init или переменная экземпляра всегда должна быть установлена ​​непосредственно в методе init?
+0

Тесно связаны, можно дублировать: http://stackoverflow.com/questions/7842641/best-way-to-set-a-retained-property-to-a-newly-created-object –

ответ

3

Единственное отличие состоит в том, что в первом примере, obj освобождается сразу (хотя он был предположительно удерживается self.obj сеттер). Эти два примера фактически одинаковы.

Обратите внимание, что в будущем, мы можем рассчитывать на ARC, чтобы иметь дело с выпуском объектов в нужное время, так что вы можете написать:

self.obj = [[SomeObject alloc] init]; 

и пусть ARC беспокоиться о том, где поставить выпуск или autorelease.

Обновление: Вы, кажется, спрашиваете, как все в порядке -init. Две вещи, которые вы должны быть в курсе являются:

  1. Когда это возможно, вы должны получить доступ к Ивар непосредственно в -init и -dealloc методами. Идея состоит в том, чтобы избежать проблем, которые могут возникнуть, если ваши аксессоры переопределены подклассом.Есть целый ряд других вопросов здесь, так что адрес этого в большей глубине, такие как:

    Why shouldn't I use Objective C 2.0 accessors in init/dealloc?

  2. Если вы создаете объект в -init метод и назначение его в Ивар, вы, вероятно, не хотят выпускать его до более поздней точки, например -dealloc. Так что да, в методе -init прекрасно, чтобы не выпускать созданные вами объекты (пока вы держите ссылку на них), но вы все равно будете балансировать это +alloc с -release в -dealloc.

+0

Ok, это имеет смысл тогда. Итак, что происходит в методе 'init' или когда переменная экземпляра была бы' nil'? Должен ли он быть установлен напрямую или использовать сеттер с функцией «autorelease»? – joshhepworth

+0

Что вы подразумеваете под «тем, что происходит в методе init?»? '-init' не заботится о ваших переменных. '+ alloc' возвращает указатель на объект. Затем сообщение «-init» отправляется этому объекту и возвращает (возможно, тот же, но возможно другой) указатель. Вы можете назначить это локальной переменной, как в первом примере. Или вы можете назначить его непосредственно свойству, как в вашем втором примере. Или вы можете назначить его непосредственно переменной экземпляра, если вы не возражаете управлять памятью самостоятельно. Устроитель с 'autorelease' в порядке. – Caleb

+0

Жаль, что я не был чист. Я имел в виду в методе 'init' класса, который я бы написал. Я читал, что здесь «правила» могут быть разными, потому что переменные экземпляра «nil», поэтому вызов «obj = [[SomeObject alloc] init];' будет правильным, а не выпуском каким-либо образом. Это была просто болонья? – joshhepworth

Смежные вопросы