最初のケースでは、コンパイラーはすでにデフォルトを追加している@synthesize var=_var;
ので、省略できます。これはClang拡張機能です
Clangは、宣言されたプロパティの自動合成をサポートします。この機能を使用して、clangは、@ dynamicで宣言されておらず、ユーザーが提供するバッキングgetterメソッドとsetterメソッドを持たないプロパティのデフォルトの合成を提供します。
2番目のケースでは、同じ名前のivarとプロパティを使用しています。これは通常、コンパイラの警告を出力します。
警告:自動合成されたプロパティ'loginDataManager'は、既存のインスタンス変数'loginDataManager'ではなく、合成されたインスタンス変数'_loginDataManager'を使用します。
ただし、@synthesize loginDataManager
警告を回避するために追加しました。
あなたの質問に答えて、
- @propertyステートメントで属性(strong、weak、...)を指定できないことを除いて、@propertyを使用するかどうかに違いはありません。
- ivarに直接アクセスすると、ゲッター/セッターを経由する必要がなくなります。これは、コンストラクターを作成していて、オブジェクトの初期化中の副作用を回避したい場合に便利です。また、プログラムはアクセサに依存してKVO / KVCまたはその他のアクションを実行する可能性があるため、一般的にはそれらの外部では悪いことです。ただし、自分でコードを記述していて、アクセサーが何をするかを知っている場合は、少し選択の余地があります。
アップデート
ARCを使用している場合(必要があります)、オブジェクトはデフォルトで、使用範囲内で強力に保持されます。つまり、ARCは保持/解放を自動的に処理し、次のいずれかを記述しても違いはありません。
@property(strong) NSObject *o;
__strong NSObject *o;
NSObject *o;
また、、、、、のいずれでアクセスしても違いはありself.o
ませ_o
んo
。まったく同じです。
ただし、他の人のコードを使用していて、その人がアクセサメソッドで他の何かを記述self.o
している場合は、そのコードを実行するように記述する必要があります。したがって、一般に、コンストラクターの外部で変数にアクセスする場合は、self.ivarが推奨されます。
-(NSObject*) o {
/* ... some other code that needs to run when you access o */
return o;
}
ARCを使用していない場合は、アクセサーがオブジェクトを適切に保持および解放するために、self.ivarを作成する必要があります。最新のXcodeで作成された最新のプロジェクトは、デフォルトでARCを使用します。