0

1)iVarに直接アクセスすることは良いアプローチですか?

2)次の中で最良のアプローチはどれですか?

@interface Some
@property (nonatomic, strong) NSString *loginDataManager;
@end

@implementation Some
@synthesize loginDataManager = _loginDataManager;
@end


@interface Some {
    NSString *loginDataManager;
}
@property (nonatomic, strong) NSString *loginDataManager;
@end

@implementation Some
@synthesize loginDataManager;
@end
4

1 に答える 1

1

最初のケースでは、コンパイラーはすでにデフォルトを追加している@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ませ_oo。まったく同じです。

ただし、他の人のコードを使用していて、その人がアクセサメソッドで他の何かを記述self.oしている場合は、そのコードを実行するように記述する必要があります。したがって、一般に、コンストラクターの外部で変数にアクセスする場合は、self.ivarが推奨されます。

-(NSObject*) o {
    /* ... some other code that needs to run when you access o */
    return o;
}

ARCを使用していない場合は、アクセサーがオブジェクトを適切に保持および解放するために、self.ivarを作成する必要があります。最新のXcodeで作成された最新のプロジェクトは、デフォルトでARCを使用します。

于 2013-03-25T11:45:17.363 に答える