Подтвердить что ты не робот

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

Ниже не комментируется компиляция или время выполнения без 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 accessor)?

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

Две не очень хорошие, но необходимые причины, чтобы убедиться, что свойства подкреплены ivars:

Если у меня есть неправильные концы пары палочек здесь, я думаю, что использование @property без явных ivars может привести к раздражениям, не оправданным удобством.