4

重複の可能性:
iOS: すべての iVar は本当にプロパティである必要がありますか?

現代の慣習は、.h ファイルの中括弧の間で ivar をまったく宣言せず、代わりにすべてのプロパティを作成することであると述べた本を読んだところです。

些細な場合でも、これが真実であることを確認したいと思います。デバイスが現在ビデオを録画しているかどうかを示す「レコーディング」という名前の BOOL があるクラスを作成しています。これは他のクラスが必要とするものではありません。私の傾向は、ヘッダーに BOOL として配置し、必要な 2 つの場所の .m ファイルで参照することです。

しかし、私はまた、受け入れられた正しい方法で物事を行いたいと思っています。しかし、なぜ私がそれを公共の財産にするのかわかりませんか?

4

5 に答える 5

8

あなたが読んだものは間違っていて、単純明快です。

現代の慣例では、ivar を合成できる対応するプロパティがある場合、ivar をスキップします。さらに、最近のバージョンの LLVM では、ivar を実装ファイルに移動して (@DrummerB が既に述べたように)、ヘッダーに ivar が含まれないようにすることができます。クラスの内部動作を公開しないため、これは良い習慣と見なされます。

しかし、ivar がまったくなく、ivar であったすべてのプロパティがありませんか? いいえ、通常の Objective-C ではありません。

于 2012-10-10T14:40:44.677 に答える
2

ivar をまったく使用しないことをお勧めします。代わりに、非表示にする必要があるプロパティを宣言するクラス拡張を作成できます。

@interface MyClass ()

@property (nonatomic, assign) BOOL recording;

@end
于 2012-10-10T14:41:35.517 に答える
1

次のようなものを使用できます

@interface G4AppDelegate ()

@property (nonatomic, assign) BOOL recording;

@end

「内部」プロパティを作成します。

または、他の回答が示すように、実装で iVar を使用します

于 2012-10-10T14:40:57.453 に答える
0

一部の本では、プライベートであっても、ivarにアクセスするためにgetterとsetterのみを使用する必要があると説明されています。これは私には少し精神病的すぎます。

clangの前に、uはクラスにカテゴリを作成し、シンセサイザーを使用してurivarをプライベートにする必要があります。このような:

@interface AppDelegate ()
@property(nonatomic, assign)int aValue;
@end

// + @implement AppDelegate // @synthetise aValue;

ゲッター/セッターの制御がなくても、単純なivarが必要になることがあるため、これは煩わしい場合があります。そして、あなたは必要のないところにコードを追加しています。

これでclangを使用して、urコードの次のようにurivarを実装ファイルに直接配置できます。

@interface AppDelegate (){
  int _aValue;
}
@end

そして、あなたはスコープ外のプライベートivarをヘッダーに隠しています。uはこれをgccでコンパイルできないことに注意してください。

于 2012-10-10T14:53:00.923 に答える