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

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

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

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

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


person SundayMonday    schedule 20.02.2012    source источник
comment
У вас есть ссылка, где @synthesize описан как ненужный?   -  person bneely    schedule 21.02.2012
comment
Возможно, он видел некоторую информацию о Xcode 4.4, находящейся в настоящее время под NDA, и запутался в номерах версий.   -  person rob mayoff    schedule 21.02.2012
comment
@bneely добавил ссылку. Возможно, я неправильно понимаю, что @synthesize является автоматическим в последних версиях компилятора LLVM 2.0.   -  person SundayMonday    schedule 21.02.2012
comment
@robmayoff больше похоже на то, что я читал потенциально устаревшую информацию :-) См. ссылки выше.   -  person SundayMonday    schedule 21.02.2012


Ответы (5)


Начиная с clang 3.2 (примерно февраль 2012 г.) синтез по умолчанию (или автоматический синтез свойств) свойств Objective-C предоставляется по умолчанию. По сути, это описано в сообщении блога, которое вы изначально читали: http://web.archive.org/web/20131006070703/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
person Quuxplusone    schedule 01.08.2012

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

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

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

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

person rob mayoff    schedule 20.02.2012
comment
Если вы предоставите ОБА геттер и сеттер, то вы потеряете автоматический ивар, верно? - person Dan Rosenstark; 30.10.2013

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

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

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

person Tlatoani    schedule 14.09.2012
comment
Обратите внимание, что автоматический синтез не поддерживается для 32-разрядной версии Mac OS X. - person ThomasW; 30.12.2012

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

person Lukas Kalinski    schedule 17.01.2014

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

person user603749    schedule 12.09.2012
comment
На самом деле это единственный правильный ответ, старый ответ. Остальное уходит вглубь. Обязательно проверьте настройки всех ваших целей, если у вас несколько - person doozMen; 27.08.2013