@synthesize は Objective-c でどのような条件下で自動化されますか?
おそらくLLVM 3.0以降を使用している場合は?@synthesize
ネットを読んだところ、Xcode 4以降は不要のようです@synthesize
。
プロパティが自動的に合成されない理由への回答の一部は、状況によっては @synthesize を省略できることを暗示しているようです。
@synthesize
将来のある時点で自動化される可能性のある別の (古い) 参照ヒント。
@synthesize は Objective-c でどのような条件下で自動化されますか?
おそらくLLVM 3.0以降を使用している場合は?@synthesize
ネットを読んだところ、Xcode 4以降は不要のようです@synthesize
。
プロパティが自動的に合成されない理由への回答の一部は、状況によっては @synthesize を省略できることを暗示しているようです。
@synthesize
将来のある時点で自動化される可能性のある別の (古い) 参照ヒント。
clang 3.2(2012年2月頃)以降、Objective-Cプロパティの「デフォルト合成」(または「自動プロパティ合成」)がデフォルトで提供されています。これは基本的に、最初に読んだブログ投稿で説明されているとおりです。 ";それが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
@synthesize
Xcode 4.4 の時点で、または@dynamic
プロパティを記述しない場合。コンパイラは、あなたが書いたかのように動作します@synthesize property = _property
。
Xcode 4.4 より前では、プロパティごとに次のいずれかを実行する必要があります。そうしないと、コンパイラが警告を発行し、実行時エラーが発生します。Xcode 4.4 以降では、コンパイラにプロパティ アクセサーとインスタンス変数を自動的に合成させる代わりに、次のいずれかを行うことができます。
@synthesize
ディレクティブを使用します。@dynamic
、何らかの方法でプロパティのゲッターと (必要に応じて) セッターを実行時に提供します。readwrite
プロパティの setter メソッドを記述します。@synthesize
ディレクティブ (または@dynamic
ディレクティブ) を使用して、getter および/または setter メソッドを明示的に提供することもできることに注意してください。ただし@synthesize
、省略した場合は提供します。
Xcode 4.4ドキュメントの新機能から:
Objective-C の @properties は、明示的に実装されていない場合、デフォルトで合成されます。
そのため、LLVM 4.0 コンパイラを使用する Xcode 4.4 以降では、@synthesize はデフォルトで自動化されています。
また、セッターとゲッターを手動で実装した場合、合成は自動になりません。したがって、@property (...) SomeType someVariable を宣言したのに、なぜ _someVariable にアクセスできないのか疑問に思うなら、それは setSomeVariable: および someVariable メソッドを実装しているためです。
左側の Project Navigator でプロジェクト名をクリックし、[Build Settings] で [All Cobined] をクリックしてから、synthesize を検索すると、合成の警告をオフにすることができます。いいえに設定する必要があります。