2011-09-18 5 views
3

可能性の重複についての質問:
Property Declaration and Automatic Backing Storage AllocationiOSの - Objective Cの - プロパティ

私はObjective-Cのにかなり新しいですし、私は基本的な質問をしたいと思います。私は2つの次の例の違いがあるかを把握しようとしています:

@interface MyViewController : UIViewController { 

     UIImageView *myImageView; 
    } 

    @property (nonatomic, retain) UIImageView *myImageView; 

    @end 

と:

@interface MyViewController : UIViewController { 

    } 

    @property (nonatomic, retain) UIImageView *myImageView; 

    @end 

正しいアプローチは何ですか?私はプロパティの使用とプロパティが何を意味するのかを知っています。問題は、最初の例と2番目の例の違いは何ですか?メモリに違いはありますか?

事前のおかげで、

アンドレアス

+0

他にも多くのものがあります。検索を実行してください。すでに利用可能な情報がたくさんあります:http://stackoverflow.com/search?page=2&tab=relevance&q=%5bobjc%5d%20declare%20ivar%20property –

答えて

8

最初の例では、の明示的なバッキング変数をプロパティに使用しています。すなわち、バッキング変数を定義し、直接アクセスすることができます。

2番目の例では、Objective-C 暗黙的にがバッキング変数を作成します。名前を知らないので、直接アクセスすることはできません。

しかし、あなたはそれに名前を付ける方法のObjective-Cを伝えることができます:

@synthesize myImageView = myImageViewVariable; 

今、あなたが直接myImageViewVariableにアクセスすることができます。異なるバッキング変数を使用する場合は、同じ構文を使用することもできます。たとえば、私は次のようにします。

@interface Foo : NSObject { 
    Bar *baz_; 
} 

@property (nonatomic, retain) Bar *baz; 
@end 

@implementation Foo 
@synthesize baz = baz_; 
@end 

これは趣味の問題です。バッキング変数とは異なる名前を付けたいのです。私はそれを明示的に宣言する必要はありませんが、私は暗黙のアクションが好きではありません。

+0

この例では、myImageViewVariableは何ですか? myImageViewを持っていて、myImageViewVariableでそのインスタンスをインスタンス化するということです。なぜあなたのプロパティであるmyImageViewではなく、myImageViewVariableにアクセスするのですか? – andreasv

+0

私の例では、プロパティ( 'self.myImageView')にアクセスすることも、バッキング変数に直接アクセスすることもできます(' myImageViewVariable')。 – DarkDust

+0

プロパティにアクセスすることの利点は、サブクラス化するときにより堅牢であること、保持が処理されるなどのことです。バッキング変数へのアクセスは少し速く(メソッド呼び出しも行われません)、ただし、サブクラス化するときに問題があり、メモリ管理も自分で行う必要があります。アクセス方法を混ぜることはOKです、btw。同様に: 'self.property = newObject; [self doSomething:propertyBackingVariable]; ' – DarkDust

2

第2のアプローチは、動的アイバーズを使用します。この偉大な記事を参照してください - あなたが実装でプロパティを@synthesizeときは、バッキングストアを定義することができiOS版および64ビットのMac OS X

あるhttp://cocoawithlove.com/2010/03/dynamic-ivars-solving-fragile-base.html

+0

。明らかに、私がこの記事から理解している限り、特にクラスの間に複数の継承がある場合は、2番目の方法が優れています。私が上の例で示しているコントローラーが、最後の子供が正しいアプローチであるとしたら、私は彼らが同じであると理解しているものと仮定します! – andreasv

+0

...あなたが後方互換性のあるコードを書こうとしない限り、それらは同じものとみなしてください。 – vikingosegundo

+0

AppleはiPhone Appの提出に対してこれらのアプローチに懸念を抱えていますか?私は、拒絶反応を招く可能性のある方法があることを意味し、特定のパターンに従うべきですか? – andreasv

1

もう一つは、現代のランタイムが必要です。

関連する問題