2009-07-08 23 views
8

Objective-C中屬性和實例變量的區別是什麼?我需要在OOP中理解這一點。屬性聲明只是一個便捷的包裝器(在實現中使用@synthesize)來訪問實例變量?iPhone開發中的Objective-C屬性

感謝,

codecowboy。

回答

7

性能和高德也給你了它是如何產生的,使其適合伊娃

控制看看各種屬性是兩個完全不同的事情。

而實例變量是存儲在對象內部的變量,所以每個實例都有自己的變量。它通過相對於對象指針/自身的指針加法來引用(稍微指向現代運行時,但在功能上等同)。 ivars通常在類內部,默認情況下只能由類及其後代(@protected)訪問。在方法中,它們沒有限定,否則它們可以(但很少是,通常不應該)通過間接訪問,例如obj-> ivar。

屬性定義了一個getter和setter(setter是可選的)接口。就是這樣。它定義了兩個公共方法:

- (TYPE) propname; 
- (void) setPropname: (TYPE) newPropname; 

這些被定義爲方法完全一樣,如果你宣稱他們這樣,沒有更多,不會少。這些方法可以用正常語法([obj propname]和[obj setPropname:n])或使用現代點符號(obj.propname或obj.propname = n)來調用。這兩個選項在語法上是不同的,它們的行爲相同,你可以用點符號來表示方法是用@property聲明還是用上面的手工聲明

然後你必須在實現中實現這些方法,可以自己編寫方法,使用@synthesize或者通過處理動態缺失的方法

屬性可能由一個ivar支持(名字相同或命名不同(我偏好避免混淆)),或者他們可能不會,他們可能會在其他地方存儲它們的值,其他數據。

例如,你可能有:

@property (nonatomic, readonly) NSString* fullname; 

,然後實現 - (的NSString *)全名返回的名字和姓氏的連接。

+0

這正是我的困惑所在。對象實例是否也擁有自己的屬性?我通常對對象的理解是它們包含關於狀態(數據)和行爲(方法)的信息。爲什麼我需要實例變量和屬性?除非我將它們聲明爲屬性,否則實例變量是不可變的嗎? – codecowboy 2009-07-08 15:26:47

0

物業實例伊娃是,這使得作爲物業,可以是可見在另一大類,而訪問伊娃或者比如你需要創建變量之間的差異該類的對象,然後你可以訪問。 和使用@synthesize編譯器將生成該屬性的setter和getter。

- (TYPE)名稱; -getter方法

- (無效)的setName:(TYPE)aName; setter方法