0

(念のために言っておきますが、iPhone 3 開発の開始: SDK の探索、Interface builder は使用していません) という本で iPhone 向けの開発を学んでいます)クラス、プライベートメンバーが表示されているとき? Foo.h のように、

NSObject *myObj;
...
@property (nonatomic, retain)NSObject *myObj;

次に、Foo.m で、self.myObj (または [self myObj]) を使用してメンバーmyObjにアクセスしますか? 私の本では、アプリの1つに書き込むように指示されているためです(UIViewControllerメンバーのビューがスーパービューにあるかどうかを確認します):

if(self.yellowViewController.view.superview == nil) {

( self .yellowViewController に注意してください...) 実際にこれには理由がありますか? メンバー blueViewController がクラス BlueViewController であるため、私が持っているアイデアが 1 つもない場合は、理由がなければ混乱を引き起こさないためだと思います。同じクラスでゲッターを使用する必要がある場合はいつでもありますか?

ありがとう!!

4

3 に答える 3

2

遅延読み込みゲッター:

- (UIImageView*) getImageView
{
    if (!imageView)
    {
        imageView = [[UIImageView alloc] initWithImage: [UIImage imageNamed: @"blah.png"]]; // just an example
    }
    return imageView;
}

imageViewの定義方法(コピー、割り当て、保持)に応じて、実際の割り当てを変更する必要がありますが、これは遅延読み込みの意味です。

于 2009-08-02T03:29:01.530 に答える
1

self.ivarインスタンス変数に直接アクセスする代わりにgetter構文を使用するいくつかの理由:

  • 他の人が言及しているように、遅延読み込みプロパティ
  • サブクラスはプロパティをオーバーライドし、スーパークラスに次のことを尊重させたい場合があります
  • アトミックプロパティを使用する場合、プロパティにアクセスする唯一の正しい方法はゲッターを使用することです
于 2009-08-02T21:51:16.757 に答える
1

はい、直接ではなくゲッターを介して ivar にアクセスすることは良いことです。

例として: Cocoa の通常の設計パターンの 1 つ (特に、リソースが非常に限られている電話で) は、遅延読み込みと呼ばれます。

要約すると、必要になるまでリソースをロードしないことを意味します。

理想的には、リクエストされたリソースがロードされているかどうかを確認し、ロードされていない場合はロードするコードを getter に配置する必要があります。ivar に直接アクセスすると、nil が返されます。別の方法は、親クラスが初期化されたときにすべての ivar を初期化することです。これにより、必要な場合とそうでない場合があるデータを保存するためにリソースが浪費される可能性があります。

これにより、再度取得できる可能性のあるリソースをapplicationDidReceiveMemoryWarning:メソッドに配置し、リソースが不足したときにそれらをダンプすることもできます。これは、必要なときにオンデマンドで再度読み込まれるためです。

于 2009-08-02T02:13:00.917 に答える