app的啟動(dòng)流程
進(jìn)入main函數(shù)芳室,在main函數(shù)中執(zhí)行了 UIApplicationMain這個(gè)方法婚肆,這是ios程序的
入口
int UIApplicationMain(int argc, char argv[], NSString principalClassName, NSString *delegateClassName)
argc峻汉、argv:ISO C標(biāo)準(zhǔn)main函數(shù)的參數(shù),直接傳遞給UIApplicationMain進(jìn)行相關(guān)處理即可
principalClassName:指定應(yīng)用程序類(lèi)凶异,該類(lèi)必須是UIApplication(或子類(lèi))楞抡。如果為nil,則用UIApplication類(lèi)作為默認(rèn)值
delegateClassName:指定應(yīng)用程序類(lèi)的代理類(lèi),該類(lèi)必須遵守UIApplicationDelegate協(xié)議
此函數(shù)會(huì)根據(jù)principalClassName創(chuàng)建UIApplication對(duì)象斤葱,根據(jù)delegateClassName創(chuàng)建一個(gè)delegate對(duì)象慷垮,并將該delegate對(duì)象賦值給UIApplication對(duì)象中的delegate屬性
UIApplication對(duì)象會(huì)依次給delegate對(duì)象發(fā)送不同的消息,接著會(huì)建立應(yīng)用程序的main runloop(事件循環(huán))揍堕,進(jìn)行事件的處理(首先會(huì)調(diào)用delegate對(duì)象的application:didFinishLaunchingWithOptions:)
程序正常退出時(shí)這個(gè)函數(shù)才返回料身。如果進(jìn)程要被系統(tǒng)強(qiáng)制殺死,一般這個(gè)函數(shù)還沒(méi)來(lái)得及返回進(jìn)程就終止了
tableview的優(yōu)化
- cell的重用
我們應(yīng)該在cell顯示出來(lái)后再執(zhí)行衩茸,可以在tableView:willdisplayCell:forRow中進(jìn)行數(shù)據(jù)綁定
willdisplayCell在tableview展示之前就會(huì)調(diào)用芹血,此時(shí)cell實(shí)例已經(jīng)生成,所以不能改變cell的結(jié)構(gòu)楞慈,只能改變cell的UI的一些屬性
2.cell的高度計(jì)算
1.定高 高度是固定的
self.tableview.rowHeight = 88
也可以在代理里面改變高度 注意 如果寫(xiě)了代理方法 上面的rowHeight將無(wú)效
2.動(dòng)態(tài)高度(就是高度不確定)
自從ios8以后就有了 self-sizing cell 的概念幔烛,cell可以自己計(jì)算高度,使用self-sizing必須滿足三個(gè)條件
- 使用autolayout布局 上下左右都要有約束關(guān)系
2.指定tableview的estimatedRowHeight屬性的默認(rèn)值
3.指定tableview的rowHeight為UITableViewAutomaticDimension
這是 在滿足這些條件后 并且 cell上的 ui不會(huì)根據(jù) 需求 hidden的時(shí)候 可以用
如果和微博 或者朋友圈是的 需要 有圖片加載圖片 并且位置關(guān)系 會(huì)變的情況 上述方法不可行
3 計(jì)算并緩存高度
類(lèi)似于朋友圈
這時(shí)候的高度 需要計(jì)算 并且計(jì)算過(guò)要緩存起來(lái) 不能每次都去計(jì)算 這樣會(huì)造成掉幀現(xiàn)象
一.先創(chuàng)建一個(gè) 高度類(lèi) 各個(gè)控件的高度 以及和上個(gè)控件之間的距離
class RowHeightModel: NSObject {
var topHeight: CGFloat = 135
var bottomHeight: CGFloat = 0
var commenTop: CGFloat = 0
var commentHeight: CGFloat = 0
var contentHeight: CGFloat = 0
var contentTop: CGFloat = 0
var likeHeight: CGFloat = 0
var likeTop: CGFloat = 0
var imageHeight: CGFloat = 0
var imageTop: CGFloat = 0
var imageW: CGFloat = 0
var askInfoHeight: CGFloat = 0
var askInfoTop: CGFloat = 0
var replyheight: CGFloat = 0
var replyTop: CGFloat = 0
var pdfTop: CGFloat = 0
var pdfHeight: CGFloat = 0
override init() {
super.init()
}
}
類(lèi)似于這個(gè)樣子
然后在網(wǎng)絡(luò)請(qǐng)求結(jié)束后 根據(jù)model計(jì)算每一個(gè)model需要占的高度
這時(shí)候又要說(shuō)了 剛進(jìn)去會(huì)不會(huì)很慢 因?yàn)樾枰?jì)算
這時(shí)候用到網(wǎng)絡(luò)緩存 具體可以去看yycache
進(jìn)頁(yè)面的時(shí)候先去取緩存數(shù)據(jù) 沒(méi)有的話 等待網(wǎng)絡(luò)請(qǐng)求
有緩存數(shù)據(jù)的話 顯示緩存數(shù)據(jù) 再刷新就好
3.渲染
4 減少視圖的數(shù)目
5 減少多余的繪制操作
6 不要給cell動(dòng)態(tài)的添加subView(這需要繪制)
7 離屏渲染
// 下面的情況會(huì)觸發(fā)離屏渲染
為圖層設(shè)置遮罩
將圖層的masksToBounds屬性設(shè)置為true
將圖層layer.allowsGroupOpacity屬性設(shè)置為true和layer.opacity小于1.0
為圖層設(shè)置陰影
具有l(wèi)ayer.cornerradius 的圖層
使用CGContext在DrawRect方法繪制 大部分情況下會(huì)導(dǎo)致離屏渲染囊蓝,甚至僅僅是一個(gè)空的實(shí)現(xiàn)
ios9之后 uibutton設(shè)置圓角會(huì)觸發(fā)離屏渲染饿悬,而UIImageView里面的png圖片設(shè)置圓角不會(huì)觸發(fā)離屏渲染,如果設(shè)置其他陰影效果之類(lèi)還是回觸發(fā)離屏渲染的