При каких условиях @synthesize автоматически в Objective-c? - PullRequest
31 голосов
/ 21 февраля 2012

При каких условиях @synthesize автоматический в Objective-c?

Возможно, при использовании LLVM 3.0 и выше?Из чтения в сети кажется, что @synthesize не нужно, начиная с Xcode 4. Однако я использую Xcode 4 и получаю предупреждения, когда у меня нет @synthesize свойства.

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

Другая (старая) ссылка намекает на то, что @synthesize может быть автоматическим в какой-то момент в будущем.

Ответы [ 5 ]

24 голосов
/ 02 августа 2012

Начиная с версии 3.2 (около февраля 2012 г.), «синтез по умолчанию» (или «автоматический синтез свойств») свойств Objective-C предоставляется по умолчанию. По сути, это как описано в сообщении в блоге, которое вы первоначально прочитали: http://www.mcubedsw.com/blog/index.php/site/comments/new_objective-c_features/ (за исключением того, что в этом сообщении эта функция описывается как «включена, затем отключена»; я не знаю, является ли это проблемой с Xcode или разработчиками Clang сами пошли взад и вперед по этому вопросу).

Насколько я знаю, единственный случай, когда свойства не будут синтезироваться по умолчанию в clang 3.2, - это когда эти свойства были унаследованы от протокола. Вот пример:

#import <Foundation/Foundation.h>

@protocol P
@property int finicky;
@end

@interface A : NSObject <P>
@property int easygoing;
@end

@implementation A
@end

int main() { A *a = [A new]; a.easygoing = 0; a.finicky = 1; }

Если вы скомпилируете этот пример, вы получите предупреждение:

test.m:11:17: warning: auto property synthesis will not synthesize property
      declared in a protocol [-Wobjc-protocol-property-synthesis]
@implementation A
                ^
test.m:4:15: note: property declared here
@property int finicky;
              ^
1 warning generated.

и если вы запустите его, вы получите сообщение об ошибке во время выполнения:

objc[45820]: A: Does not recognize selector forward:: (while forwarding setFinicky:)
Illegal instruction: 4
13 голосов
/ 15 сентября 2012

Из Новые функции в Xcode 4.4 документ:

Objective-C @properties синтезируются по умолчанию, если они явно не реализованы.

Таким образом, @synthesize по умолчанию автоматический, начиная с Xcode 4.4 с компилятором LLVM 4.0.

13 голосов
/ 21 февраля 2012

Начиная с Xcode 4.4, если вы не пишете @synthesize или @dynamic для свойства. компилятор действует так, как будто вы написали @synthesize property = _property.

До Xcode 4.4 вы должны выполнить одно из следующих действий для каждого свойства, иначе компилятор выдаст предупреждение, и вы получите ошибку времени выполнения. В Xcode 4.4 или более поздней версии вы можете сделать любую из следующих вещей вместо того, чтобы позволить компилятору автоматически синтезировать методы доступа к свойству и переменную экземпляра.

  1. Используйте директиву @synthesize.
  2. Используйте директиву @dynamic и каким-то образом предоставьте средство получения и (при необходимости) средство установки во время выполнения.
  3. Явно напишите метод получения свойства и, если свойство равно readwrite, метод установки свойства.

Обратите внимание, что вы можете использовать директиву @synthesize (или директиву @dynamic), а также явно предоставляют методы получения и / или установки. Но @synthesize предоставляет их, если вы их опускаете.

9 голосов
/ 17 января 2014

Кроме того, синтез не будет автоматическим, если вы внедрили установщик И геттер вручную. Поэтому, если вам интересно, почему вы не можете получить доступ к _someVariable, объявив @property (...) SomeType someVariable, то это потому, что вы реализовали методы setSomeVariable: и someVariable.

5 голосов
/ 13 сентября 2012

Вы можете отключить синтезирующие предупреждения, щелкнув по имени проекта в Навигаторе проектов слева, затем щелкнув «Все в связке» в настройках сборки, а затем выполните поиск по синтезу.Это должно быть установлено на №

...