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

При каких условиях @synthesize automatic в Objective-c?

При каких условиях @synthesize automatic в Objective-c?

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

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

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

4b9b3361

Ответ 1

Как и в случае с clang 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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

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