2011-09-19 64 views
2

這些有什麼不同?以下屬性聲明有什麼區別?

  1. @interface { id value),No @property

  2. @interface { id value)@property id value;@synthesis value;

  3. @interface (/* */)id value@implementation

  4. @interface (/* */)id value@implementation

  5. 別人的,如果你覺得別人好例子

預先感謝..

+0

這是什麼?它應該是代碼片段? –

回答

1
  1. 沒有編譯器生成的訪問器實例的變量。可以直接從課堂上訪問,只需拆封裝即可從外部訪問(foo->value)。

  2. 常規類屬性(=帶訪問器的實例變量)。可以使用訪問器從課程和外部訪問,可以直接從課程中訪問。

  3. 如果您的意思是@implementation {id value;},這是一個私有實例變量。非常像(1),只有變量隱藏在公共頭部。這是最近增加的AFAIK。

  4. 不是所有實例共享的類變量。

還有一個選擇,私有類屬性在實現文件中聲明:

@interface YourClass() 
@property(retain) id foo; 
@end 

@implementation YourClass 
@synthesize foo; 
@end 

這給了你很好的編譯器生成的訪問,而無需在公衆頭被曝光的變量。爲了包裝起來,我通常使用普通屬性(編號2)公開的東西和在類擴展中聲明的屬性(編號5)作爲私人東西。

+0

3)如果變量是直接在'@ implementation'關鍵字後面的大括號中聲明的,那麼您的答案纔是正確的。我對這個問題的解讀是,它僅僅是@implementation塊中聲明的一個全局變量,並且將被視爲與4)相同。無論哪種方式,你可能想澄清你在談論哪一個。 –

+0

@BJ:謝謝,我沒有意識到,我會編輯答案。 – zoul

0

這是一個實例變量(一個實例變量):

@interface sampleClass : superclass 
{ 
    NSUInteger sampleIvar; 
} 

這是私人的Ivar:

@interface sampleClass : superclass 
{ 
    @private 
    NSUInteger sampleIvar; 
} 

這是一個屬性:

@property (nonatomic,copy) NSString *sampleCopiedProperty; 
@property (atomic,copy)  NSString *sampleAtomicCopiedProperty; 
@property (nonatomic,retain) yourClass *sampleRetainProperty; 
@property (nonatomic,assign) BOOL  sampleAssignProperty; 

屬性是IVARS那讓他們的getter和setter由編譯器生成。屬性通過減少樣板代碼爲您節省時間,並讓其他類訪問您班級的ivars。

iVars具有文件範圍,可以從其他對象訪問屬性。

注意:您可以創建屬性,然後指定setter,getter和iVar的名稱。

注意:如果您使用NSMutableArray,NSMutableDictionary等,您必須親自編寫setter,並使用mutableCopy,否則編譯器生成的setter將對新值使用copy,這將導致不可變的版本。

在iOS 5.0中,除了readOnly,atomic,nonatomic,copy,retain,assign等之外,新的關鍵字__weak將被添加到屬性定義中,以幫助您爲循環引用釋放內存。