我知道HIG (這很是方便!),可是在編寫Objective-C時使用了什麼編程實踐,更具體地說,在使用Cocoa(或CocoaTouch)時。 html
黃金法則:若是你alloc
那麼你release
! web
更新:除非您使用ARC sql
我開始作的一些事情我不認爲是標準的: 數據庫
1)隨着屬性的出現,我再也不使用「_」來加上「私有」類變量的前綴。 畢竟,若是一個變量能夠被其餘類訪問,那麼它應該沒有屬性嗎? 我老是不喜歡使用「_」前綴來使代碼變得更加醜陋,如今我能夠把它留下來。 編程
2)說到私有事物,我更喜歡將.m文件中的私有方法定義放在類擴展中,以下所示: 緩存
#import "MyClass.h" @interface MyClass () - (void) someMethod; - (void) someOtherMethod; @end @implementation MyClass
爲何用外人不該該關心的東西來混淆.h文件? empty()適用於.m文件中的私有類,若是不實現聲明的方法,則發出編譯警告。 多線程
3)我已經將dealloc放在.m文件的頂部,就在@synthesize指令的下面。 你不該該把你想要在課堂上想到的東西放在最重要的位置嗎? 在像iPhone這樣的環境中尤爲如此。 性能
3.5)在表格單元格中,使每一個元素(包括單元格自己)對性能不透明。 這意味着在全部內容中設置適當的背景顏色。 大數據
3.6)使用NSURLConnection時,一般您可能但願實現委託方法: 優化
- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse { return nil; }
我發現大多數Web調用都是很是單一的,而且它比您但願緩存響應的規則更爲例外,尤爲是對於Web服務調用。 實現如圖所示的方法會禁用響應的緩存。
一樣有趣的是,Joseph Mattiello的一些優秀的iPhone特定提示(在iPhone郵件列表中收到)。 還有更多,但這些是我認爲最廣泛有用的(請注意,如今已經從原始版本略微編輯了一些內容以包含響應中提供的詳細信息):
4)若是必須,只使用雙精度,例如使用CoreLocation時。 確保以'f'結束常量以使gcc將它們存儲爲浮點數。
float val = someFloat * 2.2f;
當someFloat
實際上多是一個double時,這一點很是重要,你不須要混合模式數學,由於你在存儲上的'val'精度會失去。 雖然iPhone上的硬件支持浮點數,但與單精度相比,雙精度算術可能仍須要更多時間。 參考文獻:
在較舊的手機上,聽說計算以相同的速度運行,可是你能夠在寄存器中擁有比雙精度更多的單精度元件,所以對於許多計算,單精度最終會更快。
5)將屬性設置nonatomic
屬性。 默認狀況下它們是atomic
的,在合成時,將建立信號量代碼以防止出現多線程問題。 99%的人可能不須要擔憂這一點,而且當設置爲非原子時,代碼不那麼臃腫,內存效率更高。
6)SQLite能夠是一種很是快速的緩存大數據集的方法。 例如,地圖應用程序能夠將其圖塊緩存到SQLite文件中。 最昂貴的部分是磁盤I / O. 經過發送BEGIN;
避免許多小寫BEGIN;
和COMMIT;
大塊之間。 例如,咱們使用2秒計時器重置每一個新提交。 到期時,咱們發送COMMIT; ,這會致使全部寫入都進入一個大塊。 SQLite將事務數據存儲到磁盤並執行此開始/結束包裝可避免建立許多事務文件,將全部事務分組到一個文件中。
此外,若是您的GUI位於主線程上,SQL將阻止您的GUI。 若是您有一個很長的查詢,最好將查詢存儲爲靜態對象,並在單獨的線程上運行SQL。 確保在@synchronize() {}
塊中包裝修改數據庫的任何內容以查詢字符串。 對於簡短的查詢,只需將內容留在主線程上以方便使用。
這裏有更多的SQLite優化技巧,雖然文檔顯得過期,但許多要點可能仍然不錯;
http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html
@kendell
代替:
@interface MyClass (private) - (void) someMethod - (void) someOtherMethod @end
使用:
@interface MyClass () - (void) someMethod - (void) someOtherMethod @end
Objective-C 2.0中的新功能。
Apple的Objective-C 2.0參考中描述了類擴展。
「類擴展容許您在主類@interface塊之外的位置爲類聲明其餘必需的API」
因此它們是實際課程的一部分 - 而不是課堂上的(私人)課程。 微妙但重要的區別。
在dealloc清理。
這是最容易忘記的事情之一 - 尤爲是 當編碼爲150英里每小時。 始終,始終,始終清理dealloc中的屬性/成員變量。
我喜歡使用Objc 2屬性 - 使用新的點符號 - 因此這使得清理無痛。 一般很簡單:
- (void)dealloc { self.someAttribute = NULL; [super dealloc]; }
這將照顧你的釋放並將屬性設置爲NULL(我考慮防護性編程 - 若是dealloc中的另外一個方法再次訪問成員變量 - 不多但可能發生)。
在10.5中打開GC時,再也不須要這麼多 - 但您可能仍須要清理您建立的其餘資源,您能夠在finalize方法中執行此操做。
這是微妙的,但很方便。 若是您將本身做爲委託傳遞給另外一個對象,請在dealloc
以前重置該對象的委託。
- (void)dealloc { self.someObject.delegate = NULL; self.someObject = NULL; // [super dealloc]; }
經過這樣作,您能夠確保再也不發送任何委託方法。 當你即將dealloc
並消失在以太中時,你要確保沒有任何東西能夠偶然發送給你更多的消息。 記住self.someObject能夠被另外一個對象保留(它能夠是單例或自動釋放池或其餘任何對象),直到你告訴它「中止向我發送消息!」,它認爲你剛剛被釋放的對象是公平的遊戲。
養成這種習慣能夠避免許多奇怪的崩潰,這些都是很難調試的。
一樣的原則也適用於Key Value Observation和NSNotifications。
編輯:
更具防護性的變化:
self.someObject.delegate = NULL;
成:
if (self.someObject.delegate == self) self.someObject.delegate = NULL;