Лучший способ справиться с сохранением свойств - PullRequest
3 голосов
/ 05 декабря 2010

Если у вас есть объект со свойством, у которого есть установщик сохранения, какой из этих методов лучше всего использовать?

1

-(id)init {
    if((self = [super init])) {
        self->_retainingProperty = [[NSObject alloc] init];
    }
    return self;
}

2

-(id)init {
    if((self = [super init])) {
        self.retainingProperty = [[NSObject alloc] init];
        [self.retainingProperty release];
    }
    return self;
}

3

-(id)init {
    if((self = [super init])) {
        NSObject *obj = [[NSObject alloc] init];
        self.retainingProperty = obj;
        [obj release];
    }
    return self;
}

Все это будет связано с выпуском в dealloc

Возможно, есть другой способ, который я пропустил.

Ответы [ 3 ]

4 голосов
/ 05 декабря 2010

Я обычно просто делаю:

- (id ) init
{
   self = [super init];

   if ( self )
   {
      retainingProperty = [[NSObject alloc] init];
   }

   return self;
}

Я бы не советовал # 2 или # 3, если вы не знаете, что они могут вызывать KVO-вещи, которые вы не собираетесь.

1 голос
/ 05 декабря 2010

По крайней мере, два других способа немедленно приходят на ум. Есть прямой доступ к ивару:

- (id) init
{
    if ( self = [super init] )
    {
        _retainingProperty = [[NSObject alloc] init];
    }
    return self;
}

Или вы можете использовать пул автоматического выпуска:

- (id) init
{
    if ( self = [super init] )
    {
        self._retainingProperty = [[[NSObject alloc] init] autorelease];
    }
    return self;
}

В зависимости от класса свойства могут также существовать удобные методы, эквивалентные последнему.

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

Аналогичные соображения применимы к dealloc, кстати: лучше release напрямую использовать ваши ивары, чем использовать методы доступа к свойствам.

1 голос
/ 05 декабря 2010

Все вышеперечисленное прекрасно и в целом эквивалентно. Вы также можете получить доступ к переменной-члену, используя только ее имя:

-(id)init {
    if((self = [super init])) {
          _retainingProperty = [[NSObject alloc] init];
    }
    return self;
}

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

Если вы добавили некоторую пользовательскую логику в метод setter, вы можете убедиться, что он вызывается, всегда используя синтаксис setter свойства. Или, в качестве альтернативы, вы можете в некоторых случаях сознательно обходить эту логику и, следовательно, избегать ее использования время от времени. Это зависит от вас - все, что работает для вашего варианта использования.

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