我是這樣理解MVC的

對於MVC,我想表達一點不一樣的東西,以下觀點是我對MVC的總結以及應用。如果你存有異議或者有什麼要指教的,請留言或者聯絡我。
我擅長用的是MVC與模組化程式碼的結合,本身模組化就可以實現專案的解耦,配合MVC以及一些膠水程式碼,我發現專案維護起來十分容易

MVC可能是這樣的:
這裡寫圖片描述

首先,如果你是一個iOS的新人,你千萬不要被UIViewController所矇蔽,Controller是什麼,是控制器,控制器,控制器,他一定要有viewDidLoad嗎?不是的,一個控制器為什麼他要有viewDidLoad?
一個控制器可能是這樣的:

class XHPPController {
private var ppTopController:XHPPTopController?
private var ppBottomController:XHPPBottomController?
}
class XHPPTopController {
private var ppTopView: XHPPTopView?
private var movieLine: XHMoveLine?
func addPPTopView(contentView:UIView,frame:CGRect){
ppTopView = XHPPTopView(frame: frame)
contentView.addSubview(ppTopView!)
addMovieLineView(contentView: ppTopView!, frame: CGRect(x: 20, y: 18, width: 4, height: 56))
}
}
class XHPPBottomController: NSObject {
private var addedTagLabels: [XHTagLabel] = []
private var needAddTags: [String] = []
private var copyNeedAddTags: [String] = []
private var bottomView: XHPPBottomView?
private var lastAddTagDate: TimeInterval = 0
private var tagDelay: TimeInterval = 0.5
typealias animationHandle = ((_ error:Error?)->())
var complete:animationHandle?
private var bottomViewSpacingmodel:XHTagSpacingModel?
private var timer: Timer?
func addXHPPBottomView(contentView: UIView, frame: CGRect){
bottomViewSpacingmodel = XHTagSpacingModel.creatXHTagSpacingModel(_leftInset: 0, _topInset: 0, _rightInset: 0, _bottomInset: 0, _lineSpacing: 10, _columnSpacing: 10)
bottomView = XHPPBottomView()
bottomView?.frame = frame
contentView.addSubview(bottomView!)
}
}

其實所有的互動邏輯都可以在XHPPController中完成,由於XHPPController的邏輯複雜,而且寫在一起會粘合度非常大,膠水程式碼與實現程式碼難以明確的區分,所以我根據bottom、top拆出來兩個controller:

 private var ppTopController:XHPPTopController?
private var ppBottomController:XHPPBottomController?

每個controller分別控制一個自己相對應的邏輯,然後在controller中實現膠水程式碼。這樣的模組化加MVC就非常好的解決了一個controller上千行程式碼的問題。
同時,如果產品的top需要更改,我只需要更改topController的程式碼,實現了程式碼的可讀性以及維護性。

我的leader曾經和我講過一句話,對我感觸很大:
把你寫的每一個模組化的功能,都嚴格要求自己以SDK的標準來實現
也就是提供給外界簡單易讀的API介面。

這樣你看看,每一個模組分為幾個小模組,如果模組再複雜,那就繼續再分,然後每一個controller控制一個模組,新增膠水程式碼,有點像搭積木的感覺,感覺很棒。

此外,在談一談,關於值型別與引用型別!
好多iOS老鐵們,竟然不知道這個,更別提堆和棧以及ARC原理以及迴圈應用導致記憶體洩露了,這些東西都是聯絡在一起的。你說這些你接觸不到,那就說一些實際應用中,這些概念是有多麼的重要吧!

String A  = "123"
String B = A
A = "456"
print B ?
class AClass {
String A 
}
AClass aclass
aclaa.A = "123"
AClass bclass
bclass = aclass
aclass.A = "456"
bclass.A = ?

你可能可以回答出正確的答案,但是你有沒有想過為什麼?
如果你知道引用型別和值型別的特點,那就是原理,如果不知道建議翻看我以前的部落格。我其實已經做出瞭解答:
https://blog.csdn.net/xoxo_x/article/details/78910979

ok,下面,我們就可以聊一下高階的東西了,效能優化!

這是一個比較難的問題,但是從堆疊的角度而言,我們可以這樣優化。

首先,值型別存放在棧中,棧是有計算機控制的,引用型別放在堆中,是由ARC控制的。

所以,我們在新建一個Model時,用值型別、而非用引用型別,當然,可能你必須使用引用型別的情況除外,這就是對於記憶體優化的一點點處理。

此外了,還有切圓角,導致離屏渲染,會損失效能,如果是tableView中有大量的切圓角和資料,那麼可能會很卡,你需要想其他的辦法。

關於block,delegate,notification的說明:
首選block和delegate,當層次較深時使用notification,原因:
block 使程式碼更加緊湊, delegate 次之
notification的特性決定了他的尷尬地位