2011-11-05 7 views
0

私はいくつかのサンプルコードを見ていますが、私は特定のivarの宣言が不足していることに困惑しています。誰かが私には、この優れたを理解するのに役立ちます願って:インスタンス変数ivarを宣言せずに合成で使用することは可能でしょうか?

typedef NSUInteger (^NumberOfItemsInSection)(ViewClass *viewClass, NSUInteger section); 

// class declaration  
@interface SampleScrollView : UIScrollView 
@property (nonatomic, copy) NumberOfItemsInSection itemsSectionBlock; 
@end 

// class implementation 
@implementation SampleScrollView 

@synthesize itemsSectionBlock = _itemsSectionBlock; 

- (void)setItemsSectionBlock:(NumberOfItemsInSection)itemsSectionBlock 
{ 
    // _itemsSectionBlock is not declared any where in the class 
    // How does the compiler not complain? 

    _itemsSectionBlock = [itemsSectionBlock copy]; 
    [self reloadData]; 
} 

@end 

を、「_itemsSectionBlock」、任意の場所を宣言されていないと、それだけで、プロパティのセッターのオーバーライドに使用することができます。それはどのように機能するのですか?

答えて

1

これは現代のランタイムの一部であり、iVarsを宣言してそれらのiVarsのプロパティを宣言するコードの複製を削減します。

現代のランタイムがあなたがあなたの前に行うことができなかったと思った他のことを行うことができます@synthesize

によってあなたのために扱われます。たとえば、クラス拡張の一部として.mファイル内のiVarsを宣言することができます。これにより、パブリックインターフェイスで公開する情報の量が削減されます。

更新

現代LLVMコンパイラは4も、あなたは@sytnthesizeラインと離れて行うことができます。プロパティを宣言すると、自動的に合成され、先頭のアンダースコアを含むバッキングストアが作成されます。

+0

純粋なプライベートメンバーを定義することができますか? iVarをこの腕輪を使って永遠に忘れることができますか? – Oliver

+0

これらのiVarsがKVC/KVOに準拠していると思わない限り、 '@ private'宣言を使用して、常にプライベートプライベートメンバーを持つことができます。 setterとgetterを宣言するとすぐにメソッドを使用してアクセスでき、Objective-Cにはprivateメソッドの概念はありません。そして、はい、ほとんどの場合、私のクラスでiVarsを宣言しました。 – Abizern

+0

ゲッターとセッターはプライベートインターフェイス(.m)で宣言し、外部からプライベートにすることができます。そして、KVC/KVOの制限の問題はもうありません。 – Oliver

関連する問題