點引用是地道的Objective-C 2.0的風格。它被使用於簡單的屬性set、get操作,但對象的其它行為不
應該使用它。
Setters中對NSString進行copy
永遠不要僅僅retain一個字串。這避免了調用者在你不知道的情況下對字串作出了修改。不要作出那樣的假設:你接受的對象是一個NSString對象而不是NSMutableString對象。
- (void)setFoo:(NSString *)aFoo {
[foo_ autorelease];
foo_ = [aFoo copy];
}總結:接受NSString作為參數的setter,應該copy它所接受的字串。
這從邏輯上遵守了NSString的setter必須使用copy而不是retain。
實現委託模式的類應該:
擁有一個名為delegate_的成員變數來引用委託。
因此,訪問器方法應該名為delegate和setDelegate:。
delegate_對象不應該被retained。
不要直接比較BOOL變數與YES/NO。不僅僅這影響可讀性,結果可能與你想的不同。
使用nil的檢查來檢查應用程式的邏輯,而不是避免崩潰。Objective-C運行時會處理向一個nil的對象
發送訊息的情況。如果方法沒有傳回值,就沒關係。
總結:不要拋出Objective-C異常,但準備從第三方的調用或者系統調用捕捉異常。
當使用Objective-C++寫基於棧的對象的代碼時,如果拋出Objective-C異常,對象不會被清
理。(解構函式)
dealloc中對象被釋放的順序應該與他們在@interface中聲明的順序一致
A u to lea se之後reta in
當給一個變數賦值新的對象時,必須先釋放掉舊的對象以避免記憶體泄露。有一些正確的方法來處理
它。我們選擇autorelease之後retain的方法因為事實證明它更少地出錯。注意大的迴圈會填滿
autorelease pool,並且可能效率上會差一點,但這點折衷我們認為是可以接受的。
- (void)setFoo:(GMFoo *)aFoo {
[foo_ autorelease]; // Won't dealloc if |foo_| == |aFoo|
foo_ = [aFoo retain];
}
總結:給對象賦值時遵守autorelease之後retain的模式。
當建立臨時對象時,在同一行使用autolease,而不是在同一個方法的後面語句中使用一個單
獨的release。
不要調用NSObject類的類方法new,也不要在子類重寫。相反,你應該使用alloc和init方法來
建立並初始化一個對象。