При каких условиях @synthesize automatic в Objective-c?
При каких условиях @synthesize automatic в Objective-c?
Возможно, при использовании LLVM 3.0 и выше? От чтения по сети кажется, что @synthesize
не нужно начинать с Xcode 4. Однако я использую Xcode 4 и получаю предупреждения, когда я не @synthesize
свойство.
Некоторые ответы на Почему автоматическое синтезирование свойств не получается, кажется, подразумевает, что @synthesize может быть опущено в какой-то момент при некоторых обстоятельствах.
Другая (старая) ссылка, намекая, что @synthesize
может быть автоматическим в какой-то момент в будущем.
Ответы
Ответ 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 в настройках сборки и затем выполните поиск для синтеза. Для этого необходимо установить значение "Нет".