簡體   English   中英

Objective C中的屬性究竟是什么? 屬性和實例變量之間有什么區別?

[英]What exactly is a property in Objective C ? What is the difference between a property and an instance variable?

我對實例變量和屬性非常困惑。 我已經閱讀了有關此事的帖子數量,但我仍然不清楚。 我來自JAVA背景,我從客觀C文檔中推斷出一個屬性類似於JAVA BEAN CLASS(一個具有實例變量的getter和setter)。 可以通過getter和setter方法從其他類訪問屬性,實例變量是私有的,不能從其他類訪問。

我正朝這個方向思考嗎?

與Java並行非常好。 唯一的區別是Objective C提供了一種訪問屬性的方法,就好像它是一個變量,而Java則沒有。 另一個區別是,在Objective C中,您可以合成屬性,而在Java中,您需要手動編寫getter和setter。

屬性是getter方法或一對getter和setter方法的“語法糖”。 屬性通常(但不總是) 實例變量支持 ,但它們可以以任何可以實現無參數實例方法的方式實現。

好的,實例變量和屬性彼此相距很遠。 實例變量是對象的狀態,屬性是該狀態的assecor方法(getter / setter)(實例變量)。

因此,無論何時在頭文件中創建屬性。 編譯器將這些屬性轉換為accessor方法。 假設您聲明了屬性 - @property(nonatomic, assign, readwrite) NSString *name; 所以編譯器將轉換為

-(NSString *)name;
-(void)setName:(NSString *)name;

然后對於存取方法的定義有兩種方法。

  1. 手動 - 在實現文件(.m)中使用動態,然后通過執行此操作給出訪問器方法的定義,您將不會收到任何警告。

  2. 讓編譯器完成這項工作 - 這可以通過合成屬性來完成,例如, synthesize name; 所以現在編譯器會為你生成訪問器方法的定義。

希望能幫助到你 ;)

我知道這個主題在這里已經被打敗了......但是有些人似乎專注於技術細節,而我想提到一些與大圖片類似的東西......

將物業視為一流的伊娃。 屬性和ivars都可以為對象的屬性建模......但是如果你繼續將ivar設置為屬性,那么ivar會受到特別關注。 基本上,如果你覺得它需要getter / setter方法,你應該將屬性作為屬性(而不是ivar)。 點符號使代碼非常易讀。 這可能有助於決定何時將變量聲明為屬性而不是簡單地使用常規ivar。

目標c中的屬性實際上是setter和getter方法,可以從外部訪問類中的屬性。 所以當你宣布例如

@interface example:NSObject{
    NSString *variable;
}
@property(readwrite, assign) NSString *variable;
@end

@implementation
@synthesize variable;
@end

你實際上在宣布這些方法

-(NSString *)getVariable;
-(void)setVariable(NSString *)value;

然后您可以使用點表示法和屬性名稱來訪問,例如

instance.variable = something;
something = instance.variable;

實例變量屬性之間的主要區別在於,對於屬性,編譯器將自動生成getter / setter方法對。 例如:

@property (nonatomic) int value;

會產生:

-(void)setValue:(int)i
{
    value = i;
}
-(int)value
{
    return self->value;
}

@synthesize d。

如果你在Objective-C 1.0上抄書,你會發現這個功能不可用。 這是2.0中的一項新功能,也稱為虛線語法。 它的介紹主要是因為復雜的getter / setter語法。

此功能的好處是,即使您讓編譯器自動為您聲明了該對,您仍然可以設法覆蓋它。 例如,您仍然可以將-(void)setValue:(int)i聲明為您的類的方法,並覆蓋該行為。 這在驗證方案中很有用,例如您希望對value范圍設置限制。

就Java而言,Objective-C實際上確實具有@public實例變量語法,但@public使用它。 它類似於Java通過getter / setter保護私有變量的概念。 但它的主要目標-c是覆蓋getter / setter並最小化語法。

現在這只是一個預覽,如果你想了解更多,請參考http://cocoacast.com/?q=node/103或一些objective-c 2.0書籍。

好吧,也許不清楚屬性不需要實例變量。 您可以基於對實例變量的任何計算或范圍中的任何其他變量來定義只讀屬性。 這里的問題是您必須手動編寫getter代碼。

@interface person:NSObject{
    NSDate *birthDate;
}
@property(readonly) int age;
@end

@implementation

-(int) age{
 // return calculated age based on birthDate and today;
}
@end

屬性的名稱不需要與實例變量相同。

@synthesize myProperty = myVar;

我找到了這個驚人的線程,清楚地解釋了每一個和有關屬性的東西。

http://www.iphonedevsdk.com/forum/iphone-sdk-tutorials/7295-getters-setters-properties-newbie.html

謝謝大家的回復。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM