6

ARC プロジェクトで作業しているときに@property、インスタンス変数 (インターフェイスで宣言されている) を使用する適切な方法は何ですか? @synthesize私が今していることは次のとおりです。

SomeClass.h:

@interface SomeClass : NSObject {
  NSString *someString;
}
@property(nonatomic, copy) NSString* someString;

および SomeClass.m:

@implementation SomeClass

@synthesize someString;

- (void)someMethod {
  self.someString = @"Foobar";
}

問題は、@property だけを使用するなど、他の方法で機能することです。

SomeClass.h:

@interface SomeClass : NSObject
@property(nonatomic, copy) NSString* someString;

someStringなしで にアクセスするself:

SomeClass.m:

@implementation SomeClass

@synthesize someString;

- (void)someMethod {
  someString = @"Foobar";
}

など。Objective-c は初めてですが、Java には慣れています。では、属性を操作する適切な方法は何ですか? 特殊なケースには特殊な動作があることは理解していますが、一般的にはどのようなアプローチが最適ですか? (一般的に、クラス自体と「外部」から変数にアクセスしたいという意味で、ARCが引き続き正しく機能することを望んでいます。たとえば、メモリリークを心配する必要はありません)

4

2 に答える 2

9

単純なプロパティの場合、インスタンス変数の宣言や@synthesize. デフォルトでは、clang コンパイラが両方を生成します。したがって、ヘッダーに次のように記述できます。

@interface SomeClass : NSObject

@property (nonatomic, copy) NSString *someString;

@end

そして実装:

@implementation SomeClass

- (void)someMethod {
    self.someString = @"Foobar";
}

@end

-initメソッド内にいる場合やセッターをオーバーライドしている場合を除き、インスタンス変数への直接アクセスは避けてください。それ以外の場合は、ドット構文 ( self.someString) を使用する必要があります。インスタンス変数へのアクセスが必要な場合は、デフォルトの合成により、アンダースコアがプレフィックスとして付けられた ivar が作成されます_someString

NSString/NSMutableStringNSArray/のような変更可能なバージョンを持つクラスNSMutableArrayの場合、標準的な方法はcopyプロパティを使用することです。文字列または配列で使用するstrongと、呼び出し元が変更可能なバージョンを渡してから、それを変更して、見つけにくいバグを引き起こす可能性があります。

于 2013-03-13T12:22:28.790 に答える
-2

ARC に関する情報については、この SO 投稿を確認してください。

(編集済み) 「strong」属性は、プロパティを持つオブジェクトの割り当てが解除されるまでオブジェクトを保持するように ARC に指示します。NSString プロパティは NSMutableString として渡される可能性があるため、「copy」属性が必要です。「コピー」は、元のオブジェクトが維持されることを保証します。繰り返しますが、私が最初にここに持っていた誤った/誤解を招く情報についてお詫び申し上げます.

プロパティだけでなくインスタンス変数 にもアクセスできる理由は、行がプロパティのインスタンス変数を作成し、その値を取得および設定するためのメソッドを作成するためです。ただし、インスタンス変数を使用すると、プロパティの 1 つを変更したことを親オブジェクトに知らせることができないため、インスタンス変数を直接使用するのではなく、プロパティを使用することをお勧めします。someString self.someString@synthesize someString

于 2013-03-13T11:57:58.897 に答える