web-dev-qa-db-ja.com

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

Objective-cで@synthesizeが自動化される条件は何ですか?

おそらくLLVM3.0以降を使用しているときですか?ネットを読んでみると、Xcode4からは@synthesizeは不要のようです。しかし、Xcode 4を使用していて、プロパティを@synthesizeしないと警告が表示されます。

プロパティが自動的に合成されない理由 に対する応答の一部は、状況によっては@synthesizeをある時点で省略できることを意味しているようです。

別の(古い)参照@synthesizeが将来のある時点で自動化される可能性があることを示唆しています。

31
SundayMonday

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
24
Quuxplusone

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

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

したがって、@ synthesizeは、LLVM4.0コンパイラを使用したXcode4.4以降、デフォルトで自動化されています。

13
Tlatoani

Xcode 4.4以降、プロパティに@synthesizeまたは@dynamicを記述しない場合。コンパイラは、@synthesize property = _propertyを記述したかのように動作します。

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

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

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

13
rob mayoff

また、setter AND getterを手動で実装した場合、合成は自動化されません。したがって、@ property(...)SomeType someVariableを宣言して_someVariableにアクセスできない理由がわからない場合は、setSomeVariable:メソッドとsomeVariableメソッドを実装しているためです。

9
Lukas Kalinski

左側のプロジェクトナビゲータでプロジェクト名をクリックし、[ビルド設定]で[すべて結合]をクリックして合成を検索すると、合成の警告をオフにできます。いいえに設定する必要があります。

5
user603749