34

@synthesize は Objective-c でどのような条件下で自動化されますか?

おそらくLLVM 3.0以降を使用している場合は?@synthesizeネットを読んだところ、Xcode 4以降は不要のようです@synthesize

プロパティが自動的に合成されない理由への回答の一部は、状況によっては @synthesize を省略できることを暗示しているようです。

@synthesize将来のある時点で自動化される可能性のある別の (古い) 参照ヒント。

4

5 に答える 5

25

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
于 2012-08-01T21:03:16.587 に答える
14

@synthesizeXcode 4.4 の時点で、または@dynamicプロパティを記述しない場合。コンパイラは、あなたが書いたかのように動作します@synthesize property = _property

Xcode 4.4 より前では、プロパティごとに次のいずれかを実行する必要があります。そうしないと、コンパイラが警告を発行し、実行時エラーが発生します。Xcode 4.4 以降では、コンパイラにプロパティ アクセサーとインスタンス変数を自動的に合成させる代わりに、次のいずれかを行うことができます。

  1. @synthesizeディレクティブを使用します。
  2. ディレクティブを使用して@dynamic、何らかの方法でプロパティのゲッターと (必要に応じて) セッターを実行時に提供します。
  3. プロパティの getter メソッドを明示的に記述し、プロパティが の場合はreadwriteプロパティの setter メソッドを記述します。

@synthesizeディレクティブ (または@dynamicディレクティブ) を使用して、getter および/または setter メソッドを明示的に提供することできることに注意してください。ただし@synthesize、省略した場合は提供します。

于 2012-02-20T21:34:44.400 に答える
13

Xcode 4.4ドキュメントの新機能から:

Objective-C の @properties は、明示的に実装されていない場合、デフォルトで合成されます。

そのため、LLVM 4.0 コンパイラを使用する Xcode 4.4 以降では、@synthesize はデフォルトで自動化されています。

于 2012-09-14T21:49:30.970 に答える
12

また、セッターとゲッターを手動で実装した場合、合成は自動になりません。したがって、@property (...) SomeType someVariable を宣言したのに、なぜ _someVariable にアクセスできないのか疑問に思うなら、それは setSomeVariable: および someVariable メソッドを実装しているためです。

于 2014-01-17T12:31:31.943 に答える
5

左側の Project Navigator でプロジェクト名をクリックし、[Build Settings] で [All Cobined] をクリックしてから、synthesize を検索すると、合成の警告をオフにすることができます。いいえに設定する必要があります。

于 2012-09-12T23:20:36.943 に答える