Список реализаций по умолчанию для методов получения и установки @property - PullRequest
1 голос
/ 10 декабря 2010

@ synthesize'd Свойства Objective-C великолепны. Иногда, однако, необходимо настроить поведение геттера или сеттера. Я ищу список реализаций по умолчанию для всех 12 (3 * 2 * 2) различных сценариев:

  • ASSIGN / сохранить / копировать
  • неатомный или нет
  • геттер и сеттер

РЕДАКТИРОВАТЬ Я ищу стандартные реализации Objective C, а не низкоуровневую реализацию синтезированных свойств Clang. К сожалению, В документации Apple упоминаются лишь некоторые из вышеописанных сценариев, но не более "экзотические" атомные.

1 Ответ

3 голосов
/ 10 декабря 2010

Доступно в исходном коде Clang.См. это , в частности CodeGenFunction::GenerateObjCGetter и CodeGenFunction::GenerateObjCSetter.Обратите внимание, что код Objective C сначала не генерируется, а затем компилируется;это прямо сделано.Грубая идея состоит в том, что для неатомарного назначенного режима или в режиме только GC генерируется код прямого чтения / записи.Все остальное обрабатывается секретными функциями времени выполнения objc_setProperty и objc_getProperty.

Их определения, в свою очередь, можно найти здесь .

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

Я бы порекомендовал вам просто написать стандартный установщик / получатель, который мы использовали для написания до введения свойств.Обратите внимание, что в вашем файле .m может быть @synthesize foo и ваш пользовательский установщик setFoo:.Тогда генерируется только геттер.Аналогично с другим делом.

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

@property (nonatomic,retain) NSString*foo;

в вашем файле .h.Я бы положил в .m файл

@interface Foo (private)
     @property (nonatomic,retain) NSString*_foo;
@end

@implementation Foo
@synthesize _foo; 

и поместил настройки в foo: и setFoo::

-(NSString*)foo{
      ... do something ...
      return self._foo;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...