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

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

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

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

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

    Начиная с 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  @protocol P @property int finicky; @end @interface A : NSObject 

    @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 

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

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

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

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

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

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

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

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

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

    Давайте будем гением компьютера.