Какова цель ivar, когда свойство существует?

Следующее не жалуется при компиляции, ни времени выполнения о нет name ivar. Итак, почему настолько распространено видеть ivar и @property/@synthesize.

@interface PropTest : NSObject
{
}
@property (retain) NSString *name;
@end

@implementation PropTest
@synthesize name;
@end

int main (int argc, const char * argv[]) {
  NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
  PropTest *p = [[PropTest new] autorelease];
  p.name = @"Hello, World!";
  NSLog(@"%@",p.name);
  [pool drain];
  return 0;
}

Этот код печать

Hello, World!

На самом деле, если я получаю доступ p->name, я получаю предупреждение:

warning: instance variable 'name' is @private; this will be a hard error in the future

который указывает, что ivar создается для меня, если Вы не существуете.

Если это правда, какой смысл того, чтобы создать ivar вручную (игнорирующий очевидное, что иногда существуют допустимые причины того, что не использовалось g/setter средство доступа)?

Или спросил по-другому, я должен только когда-либо создавать ivar для свойства, когда я должен обойти средства доступа?

19
задан Lebyrt 9 May 2014 в 08:14
поделиться

2 ответа

Синтезированные ivars (возможность не объявлять ivars вручную) - это особенность новой среды выполнения Objective-C, которая до сих пор не используется во всех системах. Для 32-битных компьютеров Mac (и до недавнего времени симулятора iPhone) вам нужно вручную объявить ivars. Если вы ориентируетесь только на системы с новой средой выполнения, нет причин вручную объявлять ivars.

19
ответ дан 30 November 2019 в 03:48
поделиться

Ответ Эмана в целом верен, но есть одна причина по-прежнему объявлять ivars даже в новой среде выполнения: Apple не одобряет синтезированные средства доступа в методах init и dealloc. По сути, геттерам и сеттерам разрешено иметь побочные эффекты, отличные от простой установки переменной. В частности, они могли запускать уведомления KVO. Имея ivar для разговора, вы можете просто отправить release и покончить с этим. Но если все, что у вас есть, - это свойство, ваш единственный выбор - установить его и надеяться, что вы избежите нежелательных взаимодействий.

Честно говоря, я не уверен, насколько это большая проблема на практике. Я просто суеверно избегал этого, хотя втайне сомневаюсь, что в большинстве случаев это вызовет проблемы. Но Apple подчеркивает это в своей документации, поэтому я предполагаю, что есть некоторые причины для беспокойства.

8
ответ дан 30 November 2019 в 03:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: