15

@propertyを介してバックアップしたくないがある場合は、ivar単に を省略し@synthesize、計算された値を返す手動ゲッターを用意しました。

ただし、Xcode 4.4 以降、@synthesizedo コンパイラーを指定しないと自動的に生成されます。ivarそれは、私がそれを必要としない/使用しないという偶数も生成することを意味しますか?

最終的には、 を使用して強制的に自動合成しないようにすることができましたdynamicただし、ゲッターとセッターが別の場所またはランタイム中に実装されている@dynamic場合、警告をオフにするために使用されることになっているため、それは間違っています。

4

3 に答える 3

37

これに取り組んでいると、次の動作に気付きました。

  1. readwrite プロパティがあり、 がなく@synthesize、getter があり、setter がない場合、iVar が生成されます。
  2. readwrite プロパティがあり@synthesize、 がなく、getter がなく、setter がある場合、iVar が生成されます。
  3. readwrite プロパティがあり@synthesize、getter と setter の両方がなく、iVar が生成されない場合。
  4. 読み取り専用プロパティが@synthesizeあり、getter がなく、getter がない場合は、iVar が生成されます。
  5. 読み取り専用プロパティがあり@synthesize、getter がなく、getter がある場合、iVar は生成されません。

@synthesizeこのことから、 がなく、プロパティを完全に実装するために必要なすべてのメソッドがある場合、それは動的であると想定され、iVar を生成しないというのが一般的なルールだと思います。

とにかく、iVar が生成されないようにしたい場合は、それを として宣言し@dynamicます。


@dynamic の説明

Objective-C プログラミング言語宣言されたプロパティから:

@dynamic キーワードを使用して、メソッド実装を直接提供するか、コードの動的読み込みや動的メソッド解決などの他のメカニズムを使用して実行時に、プロパティによって暗示される API コントラクトを満たすことをコンパイラーに伝えます。

私には、ゲッターとセッターを直接実装している場合でも、プロパティを @dynamic としてマークしても問題ないように見えます。

于 2012-10-17T12:06:39.487 に答える
2

プロパティを読み取り専用にしてgetterを自分で実装するとiVarが作成されないようです。

インターフェイス宣言:

@property (nonatomic, readonly) BOOL myBoolProp;

実装:

- (BOOL)myBoolProp {
    return true;
}

これを試す:

- (void)viewDidLoad {
    [super viewDidLoad];
    _myBoolProp = true;
}

エラーが生成されます: 宣言されていない識別子 '_myBoolProp' の使用

カスタム getter メソッドを削除するとエラーも削除され、iVar が生成されたことを示しているように見えます。

于 2012-10-17T12:10:40.663 に答える
-1

はい - iVar は引き続きclang(Xcode ではなく、IDE であるため、clang が本当に重要なコンパイラです) によって生成されます。

iVar が本当に必要なく、実装も必要ない場合は、やや古風な@dynamicキーワードを使用するか、自動合成されないプロトコルでプロパティを指定できます。

// .h
@property (nonatomic, retain) NSObject *someProp;

//.m
@dynamic someProp; // no iVars generated

// other solution
@protocol MyObjectProtcol<NSObject>

@property (nonatomic, retain) NSObject *someProp;

@end

// now, when you implement the MyObjectProtocol protocol, the property won't auto-synthesize.
于 2012-10-17T12:07:30.437 に答える