0

最後に、ARCに移行します。遅すぎるように聞こえますが、私のプロジェクトはすべて3.0とのレトロ互換性があり(App Storeがサポートされていないというニュースはありますか?)、使用できません。しかし、今はiOS 5でベースデプロイメントを行う新しいプロジェクトで作業しているので、ARCを使用しています。

私の質問はとても簡単です。私はプライベートインスタンス変数とパブリックプロパティを宣言するために使用されます。例えば:

@interface MyClass : NSObject {
@private

    Var *aVar_;
    Var *anotherVar_;
}

@property (nonatomic, readonly) Var *aVar;

@end

@implementation MyClass

@synthesize aVar = aVar_;

@end

クラス内では、プロパティではなくインスタンス変数を操作します。

しかし、プロパティを使用する場合は必要で冗長ではないと思うので、今はインスタンス変数を避けようとしています。以前に読んだのは、インスタンス変数の代わりにプロパティを使用する方が良いということですが、よくわかりません。そのクラスは今そのように見えます

@interface MyClass : NSObject

@property (nonatomic, readwrite, strong) Var *aVar;

@end

@interface MyClass()

@property (nonatomic, readwrite, strong) Var *anotherVar;

@end

@implementation MyClass

@synthesize aVar = aVar_;
@synthesize anotherVar = anotherVar_;

@end

この場合、冗長性が低く、ARCがすべてのメモリの問題を考慮しているため、データの管理にインスタンス変数(下線付き)を使用していますが、それが正しいかどうかはわかりません。

また、別の質問があります。コードの最初のチャンクにあるのプロパティaVarは読み取り専用ですが、プロパティのみを使用する場合は、そのプロパティを読み取り/書き込みにする必要があります。パブリックプロパティを読み取り専用にしたい場合、@ interfaceでパブリック読み取り専用プロパティを宣言し、プライベート@interfaceでプライベート読み取り書き込みを宣言する必要がありますか?

どうもありがとう。

4

3 に答える 3

1

あなたの質問への答えはやや複雑ですが、一般的にあなたはそれのスイングを持っています。

ARCはすべてのメモリ管理を自動的に行うため、内部のニーズに合わせてivar(クラス専用、実装で宣言)を使用する方が簡単な場合がよくあります。その場合、すべての使用法は名前だけを使用します。

プロパティを使用すると、Xcode 4.4以降、Xcodeにセッターとゲッター、およびivarを合成させることができます。自動合成されたivarは、先頭に「_」文字を付けて作成されます。

実装でプロパティを読み取り専用として定義し、読み取り専用のままにして、コードで「_foo=....」として設定できます。[このサイトの多くはこれを悪い習慣だと考えています。私のポイントはあなたがそれを行うことができるということです。]

Xcode 4.4には、「暗黙の合成プロパティ」というタイトルの警告があり、デフォルトはNOです。とにかく合成を実行しますが、各プロパティに@synthesizeステートメントを指定しない場合、これにより警告が作成されます。

個人的には、可能な限りivarを使用し、他のクラスに何かを公開する必要がある場合、または複数のファイルでカテゴリを宣言する必要がある場合にのみプロパティを定義します(この場合、クラス拡張のインターフェイス宣言を独自のファイルに入れます)その中で定義されたプロパティと一緒に。)

于 2012-09-11T15:45:35.330 に答える
0

新しいObjective-Cアップデートでは、プロパティを合成する必要さえありません。宣言するだけ@property (strong, nonatomic) Var *aVar;で、コンパイラは自動的に合成を追加し、インスタンス変数self.aVarでプロパティをバックアップします。_aVar

于 2012-09-11T15:37:55.497 に答える
0

プロパティを宣言する場合、ARCはメモリ管理エラーの一部を削減しますが、実装では通常、そのプロパティを使用する必要があります。

プロパティの使用を避けることを好む人もいます。initそうすると、self部分的にしか初期化されていないオブジェクト()でKVOがトリガーされる可能性があるためです。

于 2012-09-11T15:45:28.710 に答える