Какова цель ивара, когда свойство существует? - PullRequest
19 голосов
/ 26 июля 2010

Следующее не жалуется ни на компиляцию, ни во время выполнения по поводу name 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 вручную (игнорируя очевидное, что иногда есть веские причины не использовать средство доступа g / setter)?

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

Ответы [ 3 ]

19 голосов
/ 26 июля 2010

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

8 голосов
/ 26 июля 2010

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

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

7 голосов
/ 18 октября 2010

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

  1. По какой-то причине отладчик XCode не показывает свойства, которые не имеют соответствующихIVARS явно объявленivars? )

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

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