NO IMAGE

一.計算程式碼執行時間:【注意:模擬器和真機是有差別的】

計算方法1:對簡單的工具NSDate,但精度不是很高。

NSDate *tmpStartDate = [[NSDate date] retain];

double  deltaTime  = [[NSDate date] timeIntervalSinceDate:tmpStartDate];

NSLog(@”>>>>>>>cost time = %f”,deltaTime);

計算方法2:將執行程式碼放到如下方法的block引數中,然後返回所執行的時間;

#import <mach/mach_time.h>  // for mach_absolute_time() and friends

CGFloat BNRTimeBlock(void  (^block)(void)){

mach_timebase_info_data_t info;

if(mach_timebase_info(&info)  != KERN_SUCCESS )  return  -1.0;

uint64_t start = mach_absolut_time();

block();

uint64_t  end=mach_absolute_time();

uint64_t  elapsed = end – start;

uint 64_t nanos = elapsed *info.numer / info.denom;

return (CGFloat) nanos / NSEC_PER_SEC;

二:善用效能分析工具:

XCode自帶了很強大的分析工具,包括靜態Analyze工具,以及執行時Profile工具;

例如:Instruments的使用【具體使用略】

三:具體控制元件的優化分析:

1.圖片優化:優先使用[UIImage imageNamed:@””];

與[[UIImage alloc] initWithCOntentsOfFile:]和[UIImage alloc] initWithData:]相比,[UIImage imageNamed:]有著更好的效率;這是因為:iOS會自帶緩衝通過[UIImage imageNamed:]載入影象,但該方法有一個缺點,那就是隻能載入應用程式bundle中的影象,像網路下載的影象就無能為力了,只能使用SDWebImage框架。

四:對複雜結構的view的處理:

使用drawRect自繪,而不是從nib【備註nib】中載入;

五、Tableview的優化:

1、減少cell初始化工作量,延遲載入;

2、定製複雜cell時,使用drawRect自繪;

3、緩衝儘可能多的東西,包括cell高度;

4、儘可能讓cell不透明;

5、避免使用影象特性,比如gradients;

六:使用多執行緒延遲載入資源

比如:tableViewCell中的網路影象顯示,先使用一個預設影象,然後開啟執行緒下載網路影象,當影象下載完成後,再替換預設影象;

七:線上程中使用autoreleasepool;

將一些不太重要的任務放在idle(空閒)時執行

八:不要在viewWillAppear中做費時的操作

方法viewWillAppear:會在view顯示之前被呼叫,出於效率考慮,在這個方法中不要處理複雜的事情;只應該在該方法中設定view的顯示屬性之類的簡單事情,比如背景色,字型等等。要不然,使用者會明顯感覺到view顯示遲鈍;

九:關於後臺任務:

系統進入後臺之後,一般只有10分鐘的執行時間,因此有很多值得注意的地方:

1)儘量減少記憶體的使用。因為,當記憶體不足時,iOS將會kill掉那些消耗記憶體最大的app;

2)釋放所有的共享資源。當應用程式進入後臺時,如果它還在使用或者沒有釋放掉共享資源,iOS會立即kill掉該應用;

3)正確處理app生命週期時間。

a、當應用程式進入後臺時,應該保持應用程式資料,以便回到前臺時能夠恢復。

b、當程式進入到inactive(非活動)狀態時,應該暫停當前的業務流。

c、 iOS執行app時,app在後臺執行的時間是有限的,因此後臺程式碼不應該執行非常耗時的任務,可能的話將耗時的任務用多執行緒完成。

d、當應用程式進入後臺時,ios會儲存當前app的一個快照,以便之後在合適的時候(及裝載view和資料時)呈現給使用者,以提高使用者體驗;因此在應用進入後臺時,應該避免在螢幕上呈現使用者資訊,以免洩漏使用者個人資料。

4)不要更新UI或者執行大量消耗CPU或電池的程式碼。

應用進入後臺之後,不應該執行不必要的任務,不要執行OpenGL ES呼叫,應該取消Bonjour【備註】相關服務,正確處理網路連結失敗,避免更新UI,清除所有的警告或其他彈出對話方塊;

5)保證後臺程式碼的執行工作正常,注意處理異常;

6)在後臺時正確響應系統變化。如:

UIDeviceOrientationDidChangeNotification :裝置旋轉訊息

UIApplicationSignificantTimeChangeNotification:重要的事件變化(新的一天開始或時區變化):

UIDeviceBatteryLevelDidChangeNotification和UIDeviceBatteryStateDidChangeNotification:電池變化

NSUserDefaultsDidChangeNotification:使用者預設設定變化

NSCurrentLocaleDidChangeNotification
:本地化語言變化

十:如果關鍵程式碼使用c/c /asm效率更高就使用c/c /asm;

asm:它是c 的一個關鍵字,用於在c 原始碼中內嵌組合語言;

十一:記憶體釋放

在didReceiveMemoryWarning中釋放記憶體,比如緩衝的影象和檢視(view)等,並記得呼叫父類[supper didReceiveMemoryWaring].

清理函式didReceiveMemoryWarning、viewDidUnload和dealloc都是在方法結尾呼叫父類(supper)的方法;

十二:如果一個方法在一個迴圈次數非常多的迴圈中使用,在進入迴圈前使用methodForSelector獲取該方法IMP,然後在迴圈體中直接使用該IMP;

SEL:類成員方法指標,不同於c語言中的函式指標,函式指標直接儲存了方法的地址,但SEL只是方法編號;

IMP:一個函式指標,儲存了方法的地址;

IMP和SEL關係:

每一個繼承自NSObjective的類都能自動獲得runtime的支援。在這樣的一個繼承於NSObject的類中,有一個isa指標,該指標指向該類定義的一個資料結構體(該資料結構體是由編譯器編譯時為類建立的),在這個結構體中包括:指向該類的父類的類定義和Dispatch table(該表是一張SEL和IMP的對應表)。也就是說方法編號SEL最後還是要通過Dispatch table表尋找到對應的IMP(IMP就是一個函式指標),然後執行這個方法;

以下為幾個相關方法;

1、@selector()就是去類方法的編號的 如:SEL methodID = @selector(fuc1);

2、[self   performSelector:methodIdWithObject:nil];編號獲取後執行對應的方法;

3、NSString *methodName = NSStringFromSelector(methodID);
通過編號獲取方法

4、IMP   methodPoint = [self   methodForSelector:methodID]; methodPoint();
IMP的獲取與使用

使用SEL和IMP的好處:

有了SEL這個中間過程,可以對一個SEL指向不同的函式指標,這樣就可以完成一個方法名在不同時候執行不同的函式體。另外可以將SEL作為引數傳遞給不同的類執行。也就是說我們某些業務,當只知道方法名但需要根據不同的情況讓不同類執行的時候,SEL可以幫助我們。

十三:提高APP的載入速度

避免使用靜態初始化,包括靜態c 物件,這會導致載入時增加執行的程式碼量。如: (void)load{},會造成在Main函式之前執行額外的程式碼。

十四:利用cache空間換時間

cache是一種常見的空間換時間的提供效能的手段,可以用在相當多的場合;

儘量緩衝那些可重複利用的物件,比如tableviewcell、Data、NumberFormartters、正規表示式、Sqlite語句等;

十五:資料庫

在資料庫中經常用到的優化效能的方式有:

1)緩衝經常用到的sqlite語句;

2)優化資料庫查詢語句,用sqlite3_trace 和sqlite3_profile來查詢效能差的語句,如果可以的話,緩衝查詢結果。

3)使用sqlite3_prepare會將SQL查詢語句編譯成位元組碼,要使用bind,需要的時候重用那些已經prepared的語句。

備註:

1、nib(與storybored和xib比較)

nib是3.0以前的產物,在終端下可以看到;nib其實是一個資料夾,其記憶體放著二進位制檔案;這些二進位制檔案是Interface Builder將視窗、選單欄以及視窗上的各種控制元件物件“凍結”形成的,將在程式執行時“甦醒”。nib最終在UIViewController生命週期函式loadView之前,會轉化成可執行的nib檔案,xib同樣如此;

xib是基於xml的描述檔案,可以實現視覺化程式設計;同樣的,storybored也是基於xml 的描述檔案,用來實現視覺化程式設計的;但是,他們兩者是由區別的,區別如下:

storybored是多個xib檔案集合的描述性檔案;一個工程中要一個storybored檔案就可以了。而一個工程中要有多個xib檔案,一個xib檔案對應一個檢視控制器和多個檢視控制元件。因此,在一個工程中有多個檢視控制器時,使用storybored進行管理更為方便,而且storybored可以描述介面之間的導航關係;

2、bonjour:

又叫零配置聯網。能自動發現IP網路上的電腦、裝置和服務。它使用工業標準的IP協議來允許裝置自動發現彼此,而不需要輸入IP地址或配置DNS伺服器。