2011-07-10 15 views
1

私はObjective-Cに関する悪い本を持っていると思う。それは、私が使用して、インターフェイスブラケット内の他のクラスで利用できるようにする変数を配置し、次に同じもののプロパティを宣言します。インターフェイス内にプロパティを配置する必要はありませんか?

@interface appDelegate : NSObject <UIApplicationDelegate> { 
    NSNumber *myNumberOtherClassesCanUse; 
} 
@property (nonatomic, retain) NSNumber *myNumberOtherClassesCanUse; 

はしかし、私は私が私が括弧の中に置く必要はありませんでしたので、私はそれを試してみましたが、それはまだ正常に動作考えさせられた答え別の質問を見ました。

私は別の本を購入しましたが、それも説明していないので、誰かが教えてくれますか?

答えて

4

長く複雑な答え:

クラスフィールド、インタフェースのカッコ内のもの:

@interface MyClass : SomeSuperclass 
{ 
    int someNumber_; /* this stuff */ 
} 

は、あなたのオブジェクトへの実際のバイトを追加。 Objective-Cクラスは実際には、すべてのfluffの下にあり、大規模なCの構造体です。これらはその構造体のフィールドです。 (->スタイルのCポインタ構文でも得ることができますが、コンパイラは@publicがなくてもあなたに怒鳴りますが、これらのフィールドにアクセスする正しい方法は他の変数と同じように裸の名前です)

のようなプロパティ宣言:

@property (nonatomic, assign, readwrite) int someNumber; 

があるOBJ-Cのようなメソッド宣言のペアの2.0速記:あなたのクラスに何も加えない

-(int)someNumber; 
-(void)setSomeNumber:(int)newNumber; 

。このクラスで実行できる操作がここにあることを世界に宣言するだけです。通常、このようなメソッドはフィールド値を取得して設定するか、少なくともフィールド値と同じように動作します。このような方法を使用すると、obj.propobj.prop = valのドット構文を使用して呼び出すことができます。

のsynthesizeディレクティブ:

@synthesize someNumber; 

は、必要に応じて(つまり、「非アトミック、割り当てる」もので通知)標準組み込み振る舞いを使用して、実行時に、あなたのためにこれらのメソッドを作成するには、は、必要に応じて、同じのフィールドを作成します取得して設定する名前。 @synthesize someNumber = someNumber_;のようなディレクティブは、作成されたフィールドに「someNumber_」という名前を付けます。上記のように@interfaceブロックにそのようなフィールドを宣言した場合は、そのフィールドが使用されます。それ以外の場合は、それ自身の適切なフィールドを静かに挿入します。この静かなフィールドの挿入は、4.xシミュレータ以降の新しい動作です。その前に、すべてのフィールドを@interface {}ブロックに宣言しなければなりません。

要約:@interface {...}は、オブジェクトの物理フィールドを記述します。 @property()...オブジェクトの使用方法を記述します。 @synthesizeは、基本的なgetter/setterを実装し、必要に応じて余分なフィールドを挿入するための省略形です。私は通常、フィールドを明示的に宣言する必要があるまで、通常@synthesizeにそのことをさせ、通常はデバッガでそれを見るために@interface {}ブロックを空のままにします。

[最新のSDKとしては、上記のうちのいくつかは日付です。特に、@synthesizeは現在オプションであり、.marsファイルの@implementationにインスタンス変数を宣言できます。]

+0

ありがとうrgeorge。すべてのものを財産にするには、それ以上のスペースが必要ですか? – Filo

+0

"フィールド"はストレージ、 "プロパティ"はそれをどのように取得するかです。すべてのものをプロパティにして@synthesizeにフィールドの世話をさせることは完全に正当な方法ですが、合成されたアクセサメソッドを何か面白いものに置き換えるときは違いを知る必要があります。 – rgeorge

0

あなたの本ではなく、コンパイラを信頼してください。あなたはそれがクラスで宣言バッキングIVARを検出しない場合、あなたのための変数を作成するのsynthesizeとして@property@synthesizeを使用しているとき

+0

ありがとうございます。私は間違いなくそれを念頭に置いています。 – Filo

1

あなたは、一般的に@interface括弧でそれらを配置する必要はありません。

鮮やかな本書では、iOSデバイスのランタイムは常にこの機能を備えていましたが、iOS 4のシミュレータにのみ追加されていると書かれています。したがって、シミュレータは開発に多く使用されているため、一部。 The Objective-C Programming Language

のために、このApple docの一番下にそれをバックアップする

そして、もう一つの重要な違いがあります:レガシーランタイムがないのに対し、現代のランタイムは、インスタンス変数の合成をサポートしています。

+0

ありがとうPaul.s。私はIOSレシピの本を手に入れようとしています。 – Filo

関連する問題