本節討論了如何使用申明屬性與系統內部實際使用了自動產生的方法用作屬性訪問的介面,由此引入的執行個體變數管理等等問題。
使用申明屬性 declared properties 可以方便地實現訪問器方法 accessor methods.
申明屬性為訪問器方法行為提供一種清晰,明確的規範。
編譯器幫你將申請屬性擴充為訪問器方法實現以短減你書寫的代碼量。
申明屬性也是一類別識別項並且有自己的範圍,因此編譯器可以探測到未申明的屬性。
文法:
@property(attributes) type name;
例如:
@interface MyClass : NSObject
{
float value;
}
@property float value;
@end
setter 的幾種語義:
assign: 簡單賦值
retain: 前一個值會收到一個 release 訊息。
copy: 複製
如果你不使用 記憶體回收行程,則需要指定 assign/retain/copy,否則會收到一個警告。
可以指定原子性和非原子性。
如果是 retain/copy, 則在未指定 automic 時會自動使用一個內部鎖來實現原子性。
如你使用記憶體回收機制,則可以指定引用是強引用還是弱引用,不過這個是非正式的。
@synthesize firstName, lastName, age = yearsOld;
指定了執行個體變數名的 屬性申明。
不論你是否指定執行個體變數名,這個變數都只對當前類有效而不對父類可見。
@dynamic
關於使用 @properties
任何 Object-C 的類都可以申明。
可以在子類中重新申明,而且 modifier
copy:
使用這個 property 在某些情形下比較有用,比如 要賦值一個 mutable 的 string 這樣保證後續的修改不會影響到這個已賦值的變數。
非 asign 的 property 應該
- (void)dealloc {
[property release];
[super dealloc];
}
或者(新版本,因為無法直接存取執行個體變數)
- (void)dealloc {
[self setProperty:nil];
[super dealloc];
}
子類中的 property 可以使用 writable 蓋掉父類中的 readonly 屬性。
不同的屬性對效能的影響。
在舊環境中 @synthesize 屬性的需要手動申明執行個體變數,而新系統中則不需要,系統會 自動幫你做。
本節涉及到不同類型的屬性及由此帶來的賦值方式差異,運行時效能,操作原子性,安全執行緒,向後性相容性等問題,需要在使用仔細參照。