0

私はIOSが初めてなので、簡単な質問です。

変数/フィールドなどを宣言する場所の違いは何ですか?

オプション 1 (ヘッダー ファイル)

@interface ViewController : UIViewController {
UIView *testView;
}

オプション 2 (ヘッダー ファイル)

@interface ViewController : UIViewController
@property UIView *testView;

オプション 3 (実装ファイル)

@implementation ViewController {
UIView *testView;
}
@end
4

2 に答える 2

1

それらはすべて同じ結果を達成するため、実際の違いはありません。しかし、ここに詳細があります:

オプション 1 とオプション 2:

プロパティが iVar を作成するため、iVar の宣言は冗長です。プロパティの主な役割は、アクセサー メソッド (setX および getX) を自動的に作成することであり、さらに、これらにアクセスする方法 (アトミックかどうか) または値をメモリに格納する方法 (ivar のように単純に割り当てられるか? 強いか弱いか?) を定義できます。オプション 1 のことは忘れて、常にオプション 2 に固執することをお勧めします。

@property (nonatomic, strong) UIView *yourView;

--

オプション 2 とオプション 3

(オプション 3 が別の iVar であるという事実をスキップし、ここで @property を宣言したと仮定します。その方が興味深いからです)

実装ファイル (.m) でプロパティを宣言すると、ヘッダーをインクルードする他のユーザーには表示されないという事実を除いて、違いはありません。つまり、「一種のプライベート」です。(「プライベート インターフェイス」と呼ばれることもあります)。実際のところ、セレクター (obj-c の動的な性質) を呼び出すことができるため、完全にプライベートではありません。それにもかかわらず、実装を非表示にして、ヘッダー ファイルで本当に必要なものだけを公開することをお勧めします。

したがって、内部のものにはオプション 3を使用し、外部のものにはオプション 2を使用します。

于 2013-02-15T23:00:32.230 に答える
0

オプション1:これはメンバーフィールドであり、プロパティアクセサー(つまり、ゲッター/セッター)はありません。としてアクセスする必要がありますsomeInstanceOfViewController->testView(ただし、の実装内では、これは暗黙の理由ViewControllerだけで短縮される可能性があります)。testViewself

オプション2:これはパブリックget / setプロパティです。つまり、を使用してアクセスしますsomeInstanceOfViewController.testView。プロパティのgetter/setterメソッドに関するいくつかのことをカスタマイズできます。最も一般的に使用されるのはreadonlyretain(そのプロパティをあるオブジェクトに設定すると、自動生成されたsetterメソッドがそのオブジェクトを自動的に保持し、プロパティに含まれていた古いオブジェクトを解放することを意味します)、およびassign(自動保持/解放セマンティクスなし)です。 。-(UIView *)testViewプロパティを宣言した後、自動生成されたゲッター/セッターを使用するか、 (getter)および/またはを実装して独自のゲッター/セッターを作成することができます-(void)setTestView:(UIView *)testView

オプション3:すべての動作がオプション#2であるが、コンパイラーが実装ファイル内からのみアクセスできるように強制するプライベートプロパティ。

于 2013-02-15T22:57:57.767 に答える