Objective-cで@synthesizeが自動化される条件は何ですか?
おそらくLLVM3.0以降を使用しているときですか?ネットを読んでみると、Xcode4からは@synthesize
は不要のようです。しかし、Xcode 4を使用していて、プロパティを@synthesize
しないと警告が表示されます。
プロパティが自動的に合成されない理由 に対する応答の一部は、状況によっては@synthesizeをある時点で省略できることを意味しているようです。
別の(古い)参照@synthesize
が将来のある時点で自動化される可能性があることを示唆しています。
Clang 3.2(2012年2月頃)以降、Objective-Cプロパティの「デフォルト合成」(または「自動プロパティ合成」)がデフォルトで提供されています。これは基本的に、最初に読んだブログ投稿で説明されているとおりです。 http://www.mcubedsw.com/blog/index.php/site/comments/new_objective-c_features/ (ただし、その投稿で「有効にしてから無効にする」という機能。これがXcodeの問題なのか、それともclang開発者自身が質問を行ったり来たりしたのかどうかはわかりません)。
私の知る限り、clang 3.2でプロパティがnotデフォルトで合成される唯一のケースは、それらのプロパティがプロトコルから継承されている場合です。次に例を示します。
#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
Xcode 4.4の新機能 ドキュメントから:
Objective-Cの@propertiesは、明示的に実装されていない場合、デフォルトで合成されます。
したがって、@ synthesizeは、LLVM4.0コンパイラを使用したXcode4.4以降、デフォルトで自動化されています。
Xcode 4.4以降、プロパティに@synthesize
または@dynamic
を記述しない場合。コンパイラは、@synthesize property = _property
を記述したかのように動作します。
Xcode 4.4より前では、プロパティごとに次のいずれかを実行する必要があります。そうしないと、コンパイラが警告を発行し、ランタイムエラーが発生します。 Xcode 4.4以降では、コンパイラにプロパティアクセサとインスタンス変数を自動的に合成させる代わりに、次のいずれかを実行できます。
@synthesize
ディレクティブを使用します。@dynamic
ディレクティブを使用し、実行時にプロパティゲッターと(必要に応じて)セッターを提供します。readwrite
の場合は、プロパティセッターメソッドを記述します。@synthesize
ディレクティブ(または@dynamic
ディレクティブ)を使用でき、またゲッターおよび/またはセッターメソッドを明示的に提供することに注意してください。ただし、省略した場合は@synthesize
が提供します。
また、setter AND getterを手動で実装した場合、合成は自動化されません。したがって、@ property(...)SomeType someVariableを宣言して_someVariableにアクセスできない理由がわからない場合は、setSomeVariable:メソッドとsomeVariableメソッドを実装しているためです。
左側のプロジェクトナビゲータでプロジェクト名をクリックし、[ビルド設定]で[すべて結合]をクリックして合成を検索すると、合成の警告をオフにできます。いいえに設定する必要があります。