iOS複習(二)

weixin_33797791發表於2018-09-12

app的啟動流程

進入main函式,在main函式中執行了 UIApplicationMain這個方法,這是ios程式的
入口

int UIApplicationMain(int argc, char argv[], NSString principalClassName, NSString *delegateClassName)

argc、argv:ISO C標準main函式的引數,直接傳遞給UIApplicationMain進行相關處理即可

principalClassName:指定應用程式類,該類必須是UIApplication(或子類)。如果為nil,則用UIApplication類作為預設值

delegateClassName:指定應用程式類的代理類,該類必須遵守UIApplicationDelegate協議

此函式會根據principalClassName建立UIApplication物件,根據delegateClassName建立一個delegate物件,並將該delegate物件賦值給UIApplication物件中的delegate屬性

UIApplication物件會依次給delegate物件傳送不同的訊息,接著會建立應用程式的main runloop(事件迴圈),進行事件的處理(首先會呼叫delegate物件的application:didFinishLaunchingWithOptions:)

程式正常退出時這個函式才返回。如果程式要被系統強制殺死,一般這個函式還沒來得及返回程式就終止了

tableview的優化

  1. cell的重用
我們應該在cell顯示出來後再執行,可以在tableView:willdisplayCell:forRow中進行資料繫結
willdisplayCell在tableview展示之前就會呼叫,此時cell例項已經生成,所以不能改變cell的結構,只能改變cell的UI的一些屬性

2.cell的高度計算

1.定高 高度是固定的
self.tableview.rowHeight = 88
也可以在代理裡面改變高度 注意 如果寫了代理方法  上面的rowHeight將無效

2.動態高度(就是高度不確定)
自從ios8以後就有了 self-sizing cell 的概念,cell可以自己計算高度,使用self-sizing必須滿足三個條件

  1. 使用autolayout佈局 上下左右都要有約束關係
    2.指定tableview的estimatedRowHeight屬性的預設值
    3.指定tableview的rowHeight為UITableViewAutomaticDimension
    這是 在滿足這些條件後 並且 cell上的 ui不會根據 需求 hidden的時候 可以用

如果和微博 或者朋友圈是的 需要 有圖片載入圖片 並且位置關係 會變的情況 上述方法不可行

3 計算並快取高度
類似於朋友圈
這時候的高度 需要計算 並且計算過要快取起來 不能每次都去計算 這樣會造成掉幀現象
一.先建立一個 高度類 各個控制元件的高度 以及和上個控制元件之間的距離

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()
  }
  
}

類似於這個樣子
然後在網路請求結束後 根據model計算每一個model需要佔的高度

這時候又要說了 剛進去會不會很慢 因為需要計算

這時候用到網路快取 具體可以去看yycache

進頁面的時候先去取快取資料 沒有的話 等待網路請求
有快取資料的話 顯示快取資料 再重新整理就好

3.渲染

4 減少檢視的數目
5 減少多餘的繪製操作
6 不要給cell動態的新增subView(這需要繪製)

7 離屏渲染
// 下面的情況會觸發離屏渲染
為圖層設定遮罩
將圖層的masksToBounds屬性設定為true
將圖層layer.allowsGroupOpacity屬性設定為true和layer.opacity小於1.0
為圖層設定陰影
具有layer.cornerradius 的圖層
使用CGContext在DrawRect方法繪製 大部分情況下會導致離屏渲染,甚至僅僅是一個空的實現

ios9之後 uibutton設定圓角會觸發離屏渲染,而UIImageView裡面的png圖片設定圓角不會觸發離屏渲染,如果設定其他陰影效果之類還是回觸發離屏渲染的

相關文章