3 回答

TA貢獻1784條經驗 獲得超9個贊
財產是一個更抽象的概念。實例變量實際上只是一個存儲槽,就像結構中的槽。通常,其他對象永遠不應該直接訪問它們。另一方面,屬性是您可以訪問的對象的屬性(聽起來很模糊,應該是這樣)。通常,屬性將返回或設置實例變量,但它可以使用多個數據或根本不使用數據。例如:
@interface Person : NSObject { NSString *name;}

TA貢獻1878條經驗 獲得超4個贊
屬性是一種為某些值實現getter / setter的友好方式,具有其他有用的功能和語法。屬性可以由實例變量支持,但是您也可以定義getter / setter以執行更動態的操作,例如,您可以在字符串上定義lowerCase屬性,該屬性動態創建結果而不是返回某個成員的值變量。
這是一個例子:
// === In your .h ===@interface MyObject { NSString *propertyName;}// ...@property (nonatomic, retain) NSString *propertyName;// === In your .m @implementation ===@synthesize propertyName /* = otherVarName */;
該@property
行定義了一個名為propertyName
type 的屬性NSString *
??梢允褂靡韵抡Z法獲取/設置:
myObject.propertyName = @"Hello World!";NSLog("Value: %@", myObject.propertyName);
當您分配或讀取時,myObject.propertyName
實際上是在對象上調用setter / getter方法。
該@synthesize
行告訴編譯器為您生成這些getter / setter,使用具有相同屬性名稱的成員變量來存儲值(或者otherVarName
如果您在注釋中使用語法)。
隨著@synthesize
你仍然可以定義自己的重載的getter / setter方法之一。這些方法的命名約定是setPropertyName:
針對getter的setter和propertyName
(或getPropertyName
非標準)。另一個仍將為您生成。
在您的@property
行中,您可以在屬性的parens中定義許多屬性,這些屬性可以自動執行線程安全和內存管理等操作。默認情況下,屬性是原子的,這意味著編譯器將@synthesiz
使用適當的鎖包裝ed get / set調用以防止并發問題。您可以指定nonatomic
要禁用此屬性的屬性(例如,在要將大多數屬性設置為默認的iPhone上nonatomic
)。
有3個屬性值可以控制任何@synthesized
setter的內存管理。第一個是retain
自動發送release
到屬性的舊值和retain
新值。這非常有用。
第二個是copy
復制傳入的任何值,而不是保留它們。最好使用copy
NSString,因為調用者可以傳入NSMutableString并將其從您下面更改。copy
將創建只有您有權訪問的輸入的新副本。
第三種是assign
直接指針分配而不調用舊對象或新對象上的保留/釋放。
最后,您還可以使用該readonly
屬性禁用該屬性的setter。
- 3 回答
- 0 關注
- 554 瀏覽
添加回答
舉報