本筆記不斷更新, 歡迎關注和轉載, 和大家一起進步。
一. object c及其他基本概念:
1) Object -C使用#import代替#include
2) Object -C預設檔案尾碼名是.m, Object c++的尾碼是.mm
3) 類的聲明和定義:
聲明: @interface Class: Parent { } @end
實現: Implementation以@implementationClassName開始,以@end 結束
4) 協議protocol: 類似java的interface或c++的純虛類
聲明:@protocol ProtocolName (methods you mustimplement)@end
調用某個protocol的方法: @interface SomeClass<Protocol 1, Protocol 2>
實現:不需要在標頭檔的methods列表。 直接在.m檔案裡實現它既可。
5) 屬性property: 由編譯器來自動實現屬性的擷取/設定方法。
聲明: @property(nonatomic,retain) UIButton*button;
綜合: @synthesize button;
6) 對象的建立和釋放:你建立的對象,都要負責釋放,否則就會導致記憶體泄露。預設有個init()方法。 也可以自己實現init方法,初始化一些變數。
初始化:
- 簡單方法: Object* object = [[Object alloc] init];
- 參數方法: Object* object = [[Object alloc]initWithArgument:argument];
釋放: [object release];
7) 應用程式委託: 一個應用程式委託應能完成如下工作:
1) 啟動時,必須能建立應用程式的視窗並向使用者顯示(applicationDidFinishLaunching)。
2) 必須能初始化資料
3) 必須能響應"quit退出"請求(dealloc)
4) 必須能處理低記憶體警告(applicationDidReceiveMemoryWarning)
二. IOS程式的效能和響應速度最佳化建議
1) 不要阻塞主線程
將網路請求之類的任務放到後台線程運行
2 ) 有效地使用記憶體
3) 減少應用程式的記憶體印跡
- 消除記憶體泄露:Instruments可以用來跟蹤代碼中的泄露
- 使資源檔儘可能小
- 使用Core Data或SQLite來處理大的資料
- 延緩裝載資源(lazyloadng)
- 將程式連編為Thumb格式:加入-mthumb開關可以將代碼的尺寸減少最多達35%。但是,對於具有大量浮點數運算的代碼模組,請務必將這個選項關閉,因為對那樣的模組使用Thumb反而會導致效能的下降。
4) 恰當地分配記憶體
- 減少autorelease的使用,多使用release
- 為資源設定尺寸限制
- 避免無邊界的問題集
5) 浮點數運算的考慮
如果代碼中有大量的浮點數運算,就不要用-mthumb選項來編譯代碼
6) 減少電力消耗
- 關閉當前未被使用的硬體功能,比如GPS, 加速器等
- 避免需要輪詢的工作,因為輪詢會阻止CPU進入休眠狀態。您可以通過NSRunLoop或者NSTimer類來規劃需要做的工作,而不是使用輪詢。
- 盡一切可能使共用的UIApplication對象的idleTimerDisabled屬性值保持為NO。當裝置處於不活動狀態一段時間後,空閑定時器會關閉裝置的螢幕。如果您的應用程式不需要裝置螢幕保持開啟狀態,就讓系統將它關閉。如果關閉螢幕給您的應用程式的體驗帶來負面影響,則需要通過修改代碼來消除那些影響,而不是不必要地關閉空閑定時器。
- 儘可能將任務合并在一起,以便使空閑時間最大化。每隔一段時間就間歇性地執行部分任務比一次性完成相同數量的所有任務開銷更多的電能。間歇性地執行任務會阻止系統在更長時間內無法關閉硬體。
- 避免過度訪問磁碟。舉例來說,如果您需要將狀態資訊儲存在磁碟上,則僅當該狀態資訊發生變化時才進行儲存,或者儘可能將狀態變化合并儲存,以避免短時間頻繁進行磁碟寫入操作。
- 不要使螢幕描畫速度比實際需求更快。從電能消耗的角度看,描畫的開銷很大。不要依賴硬體來壓制應用程式的幀率,而是應該根據程式實際需要的幀率來進行幀的描畫。
7) 連網操作的省電最佳化
連網是最耗電的操作,應遵循以下原則讓網路訪問最小化:
- 僅在需要的時候串連外部網路,不要對伺服器進行輪詢。
- 當您需要串連網路時,請僅傳遞完成工作所需要的最少資料。請使用緊湊的資料格式,不要包含可被簡單忽略的額外資料。
- 儘可能快地以群發(inburst)方式傳遞資料包,而不是拉長資料轉送的時間。當系統檢測到裝置沒有活動時,就會關閉Wi-Fi和蜂窩無線訊號。您的應用程式以較長時間傳輸資料比以較短時間傳輸同樣數量的資料要消耗更多的電能。
- 儘可能通過Wi-Fi無線訊號串連網路。Wi-Fi耗電比基帶無線少,是推薦的方式。
- 如果您通過CoreLocation架構收集位置資料,則請儘可能快地禁止位置更新,以及將位置過濾器和精度水平設定為恰當的值。Core Location通過可用的GPS、蜂窩、和Wi-Fi網路來確定使用者的位置。雖然Core Location已經努力使無線訊號的使用最小化了,但是,設定恰當的精度和過濾器的值可以使Core Location在不需要位置服務的時候完全關閉硬體。
8) 代碼最佳化
模擬器提供的最佳化工具可以用來消除記憶體泄露以及排除由低效演算法引起或已知瓶頸引起的計算熱點。 但在真機上運用Instruments進行最佳化才是程式發布前完全最佳化的唯一方式。
三. 經驗總結
1) 在Objective-C++中,可以用C++代碼調用方法也可以從Objective-C調用方法。在這兩種語言裡對象都是指標,可以在任何地方使用。例如,C++類可以使用Objective-C對象的指標作為資料成員,Objective-C類也可以有C++對象指標做執行個體變數。
注意:Xcode需要源檔案以".mm"為副檔名,這樣才能啟動編譯器的Objective-C++擴充。
OC++沒有為OC類增加C++的功能,也沒有為C++類增加OC的功能。不能互相繼承
小結如下:
.m 檔案可以混合c 和 objective-c 代碼。
.mm 檔案可以混合 c c++ objective-c 代碼。
.c、.cpp 不能混合有objective-c 代碼
2) 編譯靜態庫和使用
- 建立一個project, 類型是 Cocoa Touch Static Library
- 調用libstatic.a的方法:
Search Paths > Header Search Path > ../libstatic/**
加入libstatic.a: Build Phases的Link Binary With Library
- 注意lib project的target是 IOSDevice 還是emulator. 前者是arm7,後者是i386,不能混用。不過可以用lipo打包成一個.a檔案
to be continued~~~