2009-08-02 8 views
0

(私はiPhone 3の開発を始めたiPhone SDKの開発を学んでいます。インターフェースビルダーは使用しません) プライベートメンバーが表示されているときに、同じクラスでゲッターを使用する理由はありますか? self.myObj(または[自己このmyobj])を使用して、このmyobj部材アクセス、Foo.mでiPhone Dev - 同じクラスのゲッターを使用する

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

した後を有し、foo.hというで気に入りましたか?私の本の中で、ここで(そのチェックのUIViewControllerのメンバーのビューは、スーパー内にある場合)、それはアプリケーションの一つで書くことがわかりますものですので:

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

自己 .yellowViewControllerに気づきます... ) これには実際に理由がありますか?私が持っているアイデアが1つもない場合は、メンバーblueViewControllerがBlueViewControllerクラスになっている可能性があります。なぜなら、混乱を引き起こさない理由がないと思うからです。だから、いつでも同じクラスのゲッターを使う必要がありますか?

ありがとうございます!

答えて

1

はい、ゲッターで直接イバールにアクセスするのは良いことです。

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

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

理想的には、リクエストされているリソースがロードされているかどうかを確認するコードをゲッターに配置し、ロードしない場合はロードします。 ivarに直接アクセスすると、nilが返されます。代わりに、あなたの親クラスが初期化されているときにすべてのivarsを初期化することによって、必要とされないかもしれないデータを格納するリソースを無駄にする可能性があります。

これはまた、必要に応じてオンデマンドで再度ロードされるため、リソースが逼迫したときに、再度applicationDidReceiveMemoryWarning:メソッドで再度取り出される可能性のあるリソースを潜在的に配置することができます。

+0

ている点あなたはそれをどうやって知っていたのですか?あなたは私の質問に答えなかった。 – mk12

+0

私は思った。 「同じクラスのゲッターを使用する必要があるのはいつですか?」回答 - はい、遅延ロードを使用している場合(これは良いことです)。 – mmc

+0

ivarは何を意味しますか?ゲージを使ってメンバーにアクセスする唯一の時間は遅延ロードですか?レイジーローディングのゲッターを作る方法を教えてくれますか? – mk12

2

遅延ロードゲッター:

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

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

+0

ありがとう!いくつかの質問:!imageViewはimageView == nilと同じですか?そして、このimageView(例として)では、self.imageView evreywhereを使用しますか?そして、あなたはivarが何を意味するのか知っていますか?再度、感謝します! – mk12

+0

ブール値としてアクセスされると、ポインタはNULLの場合はfalse、それ以外の値の場合はtrueとして扱われます。従って!imageViewは(imageView == nil) – rpetrich

+0

と同じです。私はそれに行きました!imageViewの表記法は私がiPhone開発の初期に間違いを起こさないように努力しているからです。 (私はBOOLを== YESまたは== NOと比較してテストしていましたが、推奨されませんでした。)imageView == nilは自己文書化の観点から本当に優れています。 – Amagrammer

1

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

    他の人が
  • サブクラスを述べてきたように
  • レイジーローディングのプロパティは、プロパティをオーバーライドしてスーパークラスを持っている場合がありますはい、この本のこの部分は怠惰LOAを使用し
  • ことをあなたがアトミックプロパティを使用している場合は、プロパティにアクセスするための唯一の正しい方法は、ゲッター
+0

基本的にすべてのself.ivarがやっている場合は、ivarを返すことです、そして違いはありませんので、ちょうどivarを書くかもしれません。 – mk12

+0

右;あなたが実際にそのクラスを書くときに、そのクラスがあなたの知らないうちに後で上書きされる可能性があるということを実際には知ることができないことを除けば、もちろん、これがあなたのプロジェクトであれば、あなたはそれを決してしないと約束することができます。 –

関連する問題