UITableView性能優(yōu)化哭廉?滑動(dòng)的時(shí)候有種卡的感覺是為什么战虏?怎么解決?
· 在使用第三方應(yīng)用時(shí)轩端,卻經(jīng)常遇到性能上的問題放典,普遍表現(xiàn)在滾動(dòng)時(shí)比較卡,特備是cell包含圖片的情況時(shí)
· 實(shí)際上針對(duì)性地優(yōu)化一下就可以解決tableView滑動(dòng)時(shí)候卡頓的問題
* 使用不透明視圖基茵。不透明的視圖可以提高渲染的速度奋构。可以將cell及其子視圖的opaque屬性設(shè)為YES(默認(rèn)值)
* 不要重復(fù)創(chuàng)建不必要的cell.UITableView只需要一屏幕的UITableViewCell對(duì)象即可拱层。因此在cell不可見時(shí)弥臼,可以將其緩存起來,而需要時(shí)繼續(xù)使用它即可根灯。注意:cell被重用時(shí)径缅,需要調(diào)用setNeedsDisplayInRect:或setNeedsDisplay方法重繪cell.
* 減少動(dòng)畫效果的使用,最好不要使用insertRowsAtIndexPaths:withRowAnnimation: 方法烙肺,而是調(diào)用reloadData方法纳猪。
* 減少視圖的數(shù)目。cell包含了textLabel,detailTextLabel和ImageView等view,而你還可以自定義一些視圖放在他的contentView里桃笙,創(chuàng)建它會(huì)消耗較多資源氏堤,并且也影響性能。
* 不要做多與的繪制工作搏明。在實(shí)現(xiàn)drawRect:的時(shí)候鼠锈,它的rect參數(shù)就是需要繪制的區(qū)域,這個(gè)區(qū)域之外的不需要進(jìn)行繪制星著。
* 預(yù)渲染圖像购笆。你會(huì)發(fā)現(xiàn)即使做到了上訴幾點(diǎn),當(dāng)新的圖像出現(xiàn)時(shí)虚循,仍然會(huì)有短暫的停頓現(xiàn)象由桌。解決的辦法就是在圖形上下文中畫,導(dǎo)出UIImage對(duì)象邮丰,然后在繪制到屏幕。(頭像圓角铭乾,或者其他變形的時(shí)候剪廉,用圖像上下文能提高性能)異步繪制。
* 不要阻塞主線程炕檩。tableview在更新數(shù)據(jù)時(shí)斗蒋,整個(gè)界面都卡住不動(dòng)捌斧,完全不響應(yīng)應(yīng)用用戶強(qiáng)求。常見的是網(wǎng)絡(luò)請(qǐng)求泉沾,等待時(shí)間長(zhǎng)達(dá)數(shù)秒捞蚂。解決方案:使用多線程,讓子線程去執(zhí)行這些函數(shù)或方法跷究。
注意:當(dāng)下載線程數(shù)超過2時(shí)姓迅,會(huì)影響主線程的性能。所以在不需要響應(yīng)用戶請(qǐng)求時(shí)俊马,下載線程數(shù)可以增加到5丁存,不建議再加了,以加塊下載熟讀柴我。如果用戶正在交互解寝,應(yīng)把線程數(shù)量控制在2個(gè)以內(nèi)。
* 提前計(jì)算并緩存好高度艘儒,因?yàn)閔eightForRowAtIndexPaht調(diào)用非常頻繁聋伦。
* gzip/zip壓縮:當(dāng)從服務(wù)端下載相關(guān)附件時(shí),可以通過gzip/zip壓縮后再下載界睁,使得內(nèi)存更小觉增,下載速度也更快。
awakeFromNib與viewDidLoad區(qū)別
awakeFromNib:當(dāng).nib文件被加載的時(shí)候晕窑,會(huì)發(fā)送一個(gè)awakeFromNib消息到.nib文件中的每個(gè)對(duì)象抑片,每個(gè)對(duì)象都可以定義自己的awakeFromNib函數(shù)來響應(yīng)這個(gè)消息杨赤,執(zhí)行必要的操作。也就是說通過.nib文件創(chuàng)建view對(duì)象執(zhí)行awakeFromNib
viewDidLoad:當(dāng)view對(duì)象被加載到內(nèi)存就會(huì)執(zhí)行viewDidLoad,不管是通過.nib還是代碼形式济锄,創(chuàng)建對(duì)象就會(huì)執(zhí)行viewDidLoad.
layoutSubview何時(shí)調(diào)用避消?
1.初始化init方法時(shí)不會(huì)觸發(fā)
2.滾動(dòng)UIScrollView觸發(fā)
3.旋轉(zhuǎn)屏幕觸發(fā)
4.改變view的值觸發(fā)恕沫,前提是frame改變了
5.改變UIView的大小觸發(fā)
描述九宮格算法
1.NSInteger col = x;//定義列數(shù)
2.NSInteger index = self.shopsView.subViews.count;//獲取小標(biāo)
3.CGFloat margin = ( self.shopsView.frame.size.width - col *viewW) / (col - 1);//定義間隔
4.CGFloat viewX = (indeX % col) * (viewW + margin);
5.CGFloat viewY = (index / col) * (viewH + 10);
應(yīng)用的生命周期
1.- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions//告訴代理進(jìn)程啟動(dòng)但還沒有進(jìn)入狀態(tài)
2.- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions//告訴代理啟動(dòng)基本完成程序準(zhǔn)備開始運(yùn)行
3.- (void)applicationWillResignActive:(UIApplication *)application//當(dāng)應(yīng)用程序?qū)⒁M(jìn)入非活躍狀態(tài)執(zhí)行,在此期間,應(yīng)用程序不在接受消息和事件,比如來電話了
4.- (void)applicationDidBecomeActive:(UIApplication *)application//當(dāng)應(yīng)用程序進(jìn)入活躍狀態(tài)執(zhí)行,和上面那個(gè)方法剛好相反
5.- (void)applicationDidEnterBackground:(UIApplication *)application//當(dāng)應(yīng)用程序進(jìn)入后臺(tái)的時(shí)候調(diào)用。所以要設(shè)置后臺(tái)繼續(xù)進(jìn)行,則在這個(gè)函數(shù)里面設(shè)置即可
6.- (void)applicationWillEnterForeground:(UIApplication *)application//當(dāng)應(yīng)用程序從后臺(tái)將要重新回到前臺(tái)時(shí)候調(diào)用,這個(gè)剛好跟上面的那個(gè)方法相反
7.- (void)applicationWillTerminate:(UIApplication *)application// 當(dāng)應(yīng)用程序退出時(shí)被調(diào)用,通常是用來保存數(shù)據(jù)和一些退出前的清理工作
load initalize方法區(qū)別
+(void)load :
* 當(dāng)類對(duì)象被引入項(xiàng)目時(shí),runtime會(huì)向每一個(gè)類對(duì)象發(fā)送load消息
* load方法會(huì)在每一類甚至分類被引入時(shí)僅調(diào)用一次,調(diào)用順序:父類優(yōu)先于子類,元類優(yōu)先于父類
* load方法不會(huì)被類自動(dòng)繼承
+(void)initialize: 也是第一次使用這個(gè)類的時(shí)候會(huì)調(diào)用這個(gè)方法
什么時(shí)候會(huì)發(fā)生隱式動(dòng)畫?
當(dāng)改變CALayer的一個(gè)可做動(dòng)畫的屬性降盹,它并不能立刻在屏幕上體現(xiàn)出來价捧,相反,它是從先前的值平滑到過渡到新的值渔彰。這一切都是默認(rèn)的行為嵌屎,你不需要做額外的操作,這就是隱式動(dòng)畫恍涂。
為什么當(dāng)CoreAnimation完成時(shí)宝惰,layer又會(huì)恢復(fù)到原先的狀態(tài)?
因?yàn)檫@些產(chǎn)生的動(dòng)畫只是假象再沧,并沒有對(duì)layer進(jìn)行改變尼夺。那么為什么會(huì)這樣呢,這里要講一下圖層樹里的呈現(xiàn)樹炒瘸。呈現(xiàn)樹實(shí)際上是模型圖層的復(fù)制淤堵,但是它的屬性值表示了當(dāng)前外觀效果,動(dòng)畫的過程實(shí)際上只是修改了呈現(xiàn)樹什燕,并沒有對(duì)圖層的屬性進(jìn)行改變粘勒,所以 在動(dòng)畫結(jié)束以后圖層會(huì)恢復(fù)到原先狀態(tài)。
xib和storyboards的優(yōu)缺點(diǎn)屎即?
優(yōu)點(diǎn):
- Xib:在編譯前就提供了可視化界面庙睡,可以直接拖控件,也可以直接給控件添加約束技俐,更直觀一些乘陪,而且類文件中就少了創(chuàng)建控件的代碼,確實(shí)簡(jiǎn)化不少雕擂,通常每一個(gè)xib對(duì)應(yīng)一個(gè)類
- Storyboard: 在編譯前提供了可視化界面啡邑,可拖控件,可添加約束井赌,在開發(fā)時(shí)比較直觀谤逼,而且一個(gè)storboard可以有很多的界面贵扰,每一個(gè)界面對(duì)應(yīng)一個(gè)類文件,通過storyboard流部,可以直觀看出整個(gè)app的結(jié)構(gòu)戚绕。
缺點(diǎn):
- Xib:需求改動(dòng)時(shí),需要修改Xib很大枝冀,有時(shí)候甚至需要重新添加約束舞丛,導(dǎo)致開發(fā)周期變長(zhǎng)。xib載入相比純代碼自然要慢一些果漾。對(duì)于比較復(fù)雜邏輯控制不同狀態(tài)下顯示不同內(nèi)容時(shí)球切,使用xib是比較困難的。當(dāng)多人團(tuán)隊(duì)或者多團(tuán)隊(duì)開發(fā)時(shí)绒障,如果xib文件被發(fā)動(dòng)吨凑,極易導(dǎo)致沖突,而且解決沖突相對(duì)要困難很多端盆。
- Sttoryboard: 需求變動(dòng)時(shí)怀骤,需要修改storyboard上對(duì)應(yīng)的界面的約束,與xib一樣可能要重新添加約束焕妙,或者添加約束會(huì)造成大量的沖突蒋伦,尤其是多團(tuán)隊(duì)開發(fā)。對(duì)于復(fù)雜邏輯控制不同顯示內(nèi)容時(shí)焚鹊,比較困難痕届。當(dāng)多人團(tuán)隊(duì)或者多團(tuán)隊(duì)開發(fā)時(shí),大家會(huì)同時(shí)修改一個(gè)soryboard,導(dǎo)致大量沖突末患,解決起來相當(dāng)困難研叫。
事件傳遞與響應(yīng)的完整過程?
在產(chǎn)生一個(gè)事件時(shí)璧针,系統(tǒng)會(huì)將該事件加入到一個(gè)由UIApplication管理的事件隊(duì)列中嚷炉,UIApplication會(huì)從事件隊(duì)列中取出最前面的事件,將它傳遞給先發(fā)送事件給應(yīng)用程序的主窗口探橱。
主窗口會(huì)調(diào)用hitTest方法尋找最合適的視圖控件申屹,找到后就會(huì)調(diào)用視圖控件的touches方法來做具體的事情。
當(dāng)調(diào)用touches方法隧膏,他的默認(rèn)做法哗讥,就會(huì)將時(shí)間順著響應(yīng)者鏈條往上傳,傳遞給上一個(gè)響應(yīng)者胞枕,接著就會(huì)調(diào)用上一個(gè)響應(yīng)者的touches方法杆煞。
使用AFNetworking做過斷點(diǎn)續(xù)傳嗎?
斷點(diǎn)續(xù)傳的主要思路:
* 檢查服務(wù)文件信息
* 檢查本地文件
* 如果比服務(wù)器文件小,斷點(diǎn)續(xù)傳决乎,利用http請(qǐng)求頭的Range實(shí)現(xiàn)斷點(diǎn)續(xù)傳
* 如果比服務(wù)器文件大队询,重新下載
* 如果和服務(wù)器文件一樣,下載完成