2012-01-30 10 views
7

@interface内の変数を宣言objective-cインターフェイス - 変数を宣言するだけのプロパティですか?オブジェクト - C IN

@interface:NSObjectの{ MyObjectに* myObjectという}

@property(危険、非アトミック)MyObjectに* myObjectという。

対。唯一のプロパティとして宣言

@interface:NSObjectの{}

@property(危険、非アトミック)MyObjectに* myObjectという。 @end

ここにはvarを宣言していませんか? IVARを宣言スキップ

よろしく クリスチャン

+3

あなたの質問は何ですか? –

答えて

10

@propertyは、実装ではなくインターフェイスを定義します。あなたの場合は、readwriteプロパティを定義しています。つまり、-myObject-setMyObject:を実装すると約束しています。これは象牙とは関係ありません。

ここで、これらのメソッドを実装する最も一般的な方法は、それらをivarでバックすることです。便利なように、ObjCは、@synthesize myObject=myObject_;を使用してivarストアで必要なメソッドを自動的に生成させることができます。これは、myObjectプロパティに必要なメソッドを作成し、myObject_という名前の自動的に作成されたivarを使用します。 ivar myObject_は実際のivarです。通常はアクセスできますが(通常は使用しないでくださいが、アクセサーを使用する必要があります)。

@synthesizeの代わりに、-myObject-setMyObject:を実装することができます。あなたは@dynamic myObject;を使ってコンパイラに "このプロパティの実装について心配する必要はなく、実行時に正しく処理されます。"

あり@propertyとちょうど宣言する方法はいくつかの違いがありますが、原則的には、この行:

@property (nonatomic, readwrite, strong) MyObject* myObject; 

は概念的にこれと同じである:

IVARを宣言
- (MyObject *)myObject; 
- (void)setMyObject:(MyObject *)anObject; 

自分がノーを持っていますここに本当の影響があります。あなたはまだ何らかの形でメソッドを実装する必要があります。あなたの指定されたivarがivarと同じ場合は@synthesizeが使用され、@synthesizeは新しいivarを作成しません。

実際には、私はもうイワールを宣言しないようにしています。私はちょうど@synthesizeと公開と私有のプロパティを使用して、必要なivarsを作成することをお勧めします。なんらかの理由でマニュアルのivarが必要な場合は、@interfaceではなく@implementationブロックで宣言することをお勧めします。

9

は完全に罰金です - しかし、あなたはXcodeのIDEでIVARの値を表示することはできません。ある日Appleはこれを解決するかもしれない。

あなたはGDBやlldbでそれを調べるためにivarを "po"することができます。

+0

+1これは、最近私がデバッガにたくさんの誓いをしてくれました。 –

+0

Appleにバグレポートを提出してください:bugreport.apple.com – zaph

関連する問題