0

現在の iOS プロジェクトを ARC を使用するようにリファクタリングしようとしています。そして、「ARC へのリファクタリング」ツール i xCode を使用して現在のコードを ARC に移行するための変更をプレビューした後、現在のコード規則がおそらく ARC に適していないことがわかります。それは私のivarに__weak / __strongなどをたくさん追加するからです。

私の現在の慣例は次のとおりです。

すべてのインスタンス変数をプライベートまたは保護された ivar として定義します。@property を作成するすべてのパブリック変数。

@interface TestClass
{
 @private
 NSMutableArray* mArray;
 NSString* mString;
 BOOL mMyBoolean;
}

@property (retain, nonatomic) NSString* string; // public
@end

リリース/保持の処理を避けるために、すべてのオブジェクトは常に@propertyに戻ります。そのため、参照であるプライベート変数がある場合は、実装でカテゴリを作成するだけです。Struct (mMyBoolean のような) Ivar として定義したままにします。

@interface TestClass()
@property (retain, nonatomic) NSmutableArray* mArray;
@end

@implementation TestClass
@synthesize string = mString;
@synthesize mArray;

@end;

しかし、新しい ARC が保持/解放を処理しているため、@property によってバックアップされるプライベート変数は必要ありません。

では、どのコード規則がより適切でしょうか? 次のように、インターフェイスでプロパティを定義することだけを考えていました。

@interface TestClass
{
 @private
 NSMutableArray* mArray;
 BOOL myBoolean;
}

@property (strong, nonatomic) NSString* string;
@end


@implementation TestClass
@synthesize string;
@end

また、プライベート プロパティにカテゴリ プロパティを使用しないでください。(また、「m」プレフィックスを削除しました)、@propertyが使用する必要のある裏打ちされたivarを定義しません。代わりに、xcodeに自動生成された?.

4

1 に答える 1

1

これはどちらかというとスタイルの問題なので... 客観的に答えるのは難しいですが、私は 2 セントを投じます。私が見る限り、あなたがしていることには何の問題もありません。あなたの目標がよりクリーンなコードを作成するために何ができるかを確認することである場合は、命名規則を共有します (ただし、ある人のジャンクは別の人の宝物です。そのため、それが気に入らない場合は...まあ、難しいハハ、あなたはそうしません)そこから何かを奪う必要はありません)。

1) iVar は m で始まり、公開されることはありません。

2) アンダーバー (_) で始まる変数名に合成されたプロパティ。継承されたクラスが読み取り専用変数を内部で変更できるようにする必要がない限り、明示的なバッキング変数はありません。その場合、それをパブリック インターフェイスに移動する必要があります (そして、それがプロパティ変数であることを自分自身に示すために、アンダーバーを付けて名前を付けます)。プロパティは、インターフェイスを介していくつかの情報を公開することを目的としていますが、実装はすべてにアクセスできるため、意味がありません。次の場合を除いて、プライベート インターフェイスでプロパティを使用することはありません。

3) 遅延ロードするプロパティ、または単に変数に代入する以外のロジックを持つプロパティ。この場合、getter または setter (両方ではない) のみをオーバーライドすると、(_) に合成され、目的のメソッドがオーバーライドされます (明示的な変数は必要ありません)。両方をオーバーライドした場合、合成は行われず、明らかに明示的なバッキング変数が必要になります (KVO メソッドを呼び出すことを忘れないでください ^^)。

私が想像するこの種のことを行うための「正しい」方法はありません...普遍的であると思われる唯一のガイドラインは

1) あなたとあなたのチームが簡単に理解できる方法で行う

2) 一貫して行う

3) API の場合は、ヘッダー ファイルだけを見てわかりやすいようにします。

于 2012-04-18T07:40:49.513 に答える