這些有什麼不同?以下屬性聲明有什麼區別?
@interface { id value)
,No@property
。@interface { id value)
,@property id value;
和@synthesis value;
@interface (/* */)
,id value
在@implementation
@interface (/* */)
,id value
了@implementation
別人的,如果你覺得別人好例子
預先感謝..
這些有什麼不同?以下屬性聲明有什麼區別?
@interface { id value)
,No @property
。
@interface { id value)
,@property id value;
和@synthesis value;
@interface (/* */)
,id value
在@implementation
@interface (/* */)
,id value
了@implementation
別人的,如果你覺得別人好例子
預先感謝..
沒有編譯器生成的訪問器實例的變量。可以直接從課堂上訪問,只需拆封裝即可從外部訪問(foo->value
)。
常規類屬性(=帶訪問器的實例變量)。可以使用訪問器從課程和外部訪問,可以直接從課程中訪問。
如果您的意思是@implementation {id value;}
,這是一個私有實例變量。非常像(1),只有變量隱藏在公共頭部。這是最近增加的AFAIK。
不是所有實例共享的類變量。
還有一個選擇,私有類屬性在實現文件中聲明:
@interface YourClass()
@property(retain) id foo;
@end
@implementation YourClass
@synthesize foo;
@end
這給了你很好的編譯器生成的訪問,而無需在公衆頭被曝光的變量。爲了包裝起來,我通常使用普通屬性(編號2)公開的東西和在類擴展中聲明的屬性(編號5)作爲私人東西。
3)如果變量是直接在'@ implementation'關鍵字後面的大括號中聲明的,那麼您的答案纔是正確的。我對這個問題的解讀是,它僅僅是@implementation塊中聲明的一個全局變量,並且將被視爲與4)相同。無論哪種方式,你可能想澄清你在談論哪一個。 –
@BJ:謝謝,我沒有意識到,我會編輯答案。 – zoul
這是一個實例變量(一個實例變量):
@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
將被添加到屬性定義中,以幫助您爲循環引用釋放內存。
這是什麼?它應該是代碼片段? –