Objective-C: Xcode автоматически распознает '= _property ": это @synthesize созданное имя переменной? - PullRequest
1 голос
/ 12 октября 2011

Когда вы объявляете @property и @synthesize, считается хорошей практикой использовать:

@synthesize myProperty = _myProperty;

Я заметил, что Xcode автоматически заполняет для вас имя ivar _myProperty,хотя он еще не использовался в исходном коде.

Это потому, что ivar @synthesize автоматически создает по умолчанию имя _myProperty?Или просто потому, что XCode поддерживает это общее соглашение с автозаполнением для него?

Спасибо.

РЕДАКТИРОВАТЬ: Я не ищу причины, почему это хорошая практика;Я уже знаю об этом и уже использовал это соглашение некоторое время.Я хочу понять внутренности, поэтому спрашиваю, является ли это жестко запрограммированное правило автозаполнения для удовлетворения соглашения, или это стандартное автозаполнение, и фактически спецификация Objective-C диктует, что ивар, сгенерированный @synthesizeдолжен иметь форму _myProperty, таким образом, после закулисной генерации ивара автозаполнение осознает его существование.Спасибо!

Ответы [ 4 ]

2 голосов
/ 12 октября 2011

Я думаю, что автозаполнение - это удобство IDE, а не результат времени выполнения.Моя логика для этого заключается в том, что следующее представляется действительным:

@interface SomeClass()
@property (nonatomic, assign) int unpublishedInstanceVariable;
@end

@implementation SomeClass
@synthesize unpublishedInstanceVariable;

- (void)someMethod
{
    unpublishedInstanceVariable = 3; // not calling the setter
}
@end
1 голос
/ 04 сентября 2012

Начиная с Xcode 4.4, есть новый поворот хвоста ( sic ).

  • Теперь мы можем вообще пропустить @synthesize.В этом случае компилятор автоматически генерирует для нас объявление @synthesize foo = _foo; с именем переменной экземпляра с префиксом подчеркивания.

@interface Foo : NSObject
@property (nonatomic, copy) NSString *foo;
@end

@implementation Foo
- (void)bar {
    NSLog(@"%@", _foo); // this Works!
}   
@end
  • Однако, если у нас есть явный оператор @synthesize, но мы не указываем имя переменной экземпляра, тогда имя переменной экземпляра по умолчанию совпадает с именем свойства, т.е. не имеет префикса с подчеркиванием, в этом случае @Ответ Томми остается в силе.

Было бы замечательно, если бы кто-то мог указать ссылки на официальные документы Apple, документирующие это поведение.

Обновление

Мои выводы были точными.Такое поведение (по умолчанию @synthesize и создание префиксной переменной экземпляра с подчеркиванием на основе подчеркивания при отсутствии явного синтеза и т. Д.) Было публично объявлено в WWDC 2012 Session 405 - Modern Objective-C .

1 голос
/ 12 октября 2011

жестко запрограммированное правило автозаполнения для удовлетворения соглашения

Если вы не укажете имя iVar явно, оно будет называться myProperty.Автозаполнение не имеет ничего общего с компилятором, просто Xcode очень полезен.

0 голосов
/ 04 сентября 2012

относительно этой части вашего вопроса:

действительно ли ... Objective-C спецификация диктует, что ивар, сгенерированный @synthesize, должен иметь форма _myProperty,

Вы можете назвать свой ивар как угодно. Из документов:

Вы можете использовать свойство свойства = ivar, чтобы указать, что конкретный Для свойства должна использоваться переменная экземпляра, например:

@synthesize firstName, lastName, age=yearsOld; 

Указывает, что методы доступа для firstName, lastName и age должны быть синтезирован и что свойство age представлено экземпляром переменная yearsOld.

Кроме того,

Директива @synthesize также синтезирует соответствующую переменную экземпляра, если она не объявлена ​​иначе .

...