第一部分:基礎知識
1.oc中的各種鎖。為什么有效率高低之分?
鎖是線程編程同步工具的基礎。iOS開發(fā)中常用的鎖有如下幾種:
1.@synchronized
2.NSLock 對象鎖
3.NSRecursiveLock 遞歸鎖
4.NSConditionLock 條件鎖
5.pthread_mutex 互斥鎖(C語言)
6.dispatch_semaphore 信號量實現(xiàn)加鎖(GCD)
7.OSSpinLock (暫不建議使用,原因參見這里,在 iOS 10/macOS 10.12 發(fā)布時,蘋果提供了新的?os_unfair_lock 作為 OSSpinLock 的替代裸卫,并且將 OSSpinLock 標記為了 Deprecated。)
為什么會有效率高低之分?
請參考下面這篇文章:iOS開發(fā)中自旋和互斥鎖的理解以及所有鎖的性能比較
參考資料: 1.??iOS 中幾種常用的鎖總結(jié)
2.mvc和mvvm的區(qū)別纽竣,各有什么優(yōu)劣墓贿?
MVC :
先說一下作為一個開發(fā)人員來說,眾所周知的一個設計模式:MVC,全稱為:Model-View-Model.主要目的:分離視圖(View)和模型(Model).想必我們用著已經(jīng)非常習慣,但是他有存在一些問題,這是筆者想通過此文告訴大家的:
1.模型的代碼少
2.控制器的代碼卻是越寫越多
3.由于寫的代碼較多,故不好進行性能測試
MVVM :
全稱:Model-View-ViewModel 茧泪,MVVM 模式和 MVC 模式一樣,主要目的也是分離視圖(View)和模型(Model)概念:
1.在MVVM中,view與viewController正式聯(lián)系在一起,我們可以把他們視為一個組件
2.在MVVM架構(gòu)中,view與viewController均不能直接引用model,而是通過引用viewModel來間接引用model
3.很多人會問,viewModel是一個什么樣的架構(gòu)呢?里面應該放些什么樣的東西呢?我們可以在viewModel中放置用戶輸入邏輯,視圖顯示邏輯及發(fā)送網(wǎng)絡請求和其他一些代碼
那么作為一種新型的架構(gòu)模式,在使用時應該有哪些地方值得我們注意呢?
1.view 可以引用viewModel,但反過來卻是不行
2.viewModel 可以引用model,但是反過來也不行
3.如果我們違背了上述規(guī)則,那么我們將會無法正常使用MVVM
MVVM自推出以后,便得到了大多數(shù)開發(fā)人員的認可,那么MVVC這種設計模式有什么優(yōu)點呢?
1.低耦合:view/viewController可以獨立于Model而進行變化和修改,與此同時,一個viewModel可以綁定到不同的view/ViewController上
2.可重用性:可以把一些視圖邏輯放在一個ViewModel里面,讓很多view/ViewController進行重用
3.獨立開發(fā):通過MVVM,開發(fā)人員可以專注于邏輯開發(fā)在viewModel里面,而設計人員也可以專注于頁面設計,并且使用ExpressionBlend可以更加容易設計頁面和生成XAML(Extensible Application Markup Language)代碼.
4.可測試:通常來說,要進行,界面測試比較困難,而MVVM可以對viewModel進行測試.
3.程序什么時候會發(fā)生崩潰聋袋?
遞歸調(diào)用队伟,主線程卡死,死鎖幽勒。權(quán)限不足嗜侮。本地數(shù)據(jù)庫改變,excbadaccess
4.拓展和分類是什么時候被實現(xiàn)的啥容?
分類是在運行時,拓展是在編譯時確定的.
5.事件的響應鏈锈颗,如何判斷控件能否響應事件?
6.你是怎么使用通知的?在子線程發(fā)出的通知能在主線程收到通知嗎?代理咪惠,通知击吱,block用法,kvo用法?
7.block為什么用copy修飾?
因為在MRC下遥昧,block在創(chuàng)建的時候覆醇,它的內(nèi)存是分配在棧(stack)上的,而不是在堆(heap)上炭臭,可能被隨時回收永脓。他本身的作于域是屬于創(chuàng)建時候的作用域,一旦在創(chuàng)建時候的作用域外面調(diào)用block將導致程序崩潰鞋仍。通過copy可以把block拷貝(copy)到堆常摧,保證block的聲明域外使用。在ARC下寫不寫都行威创,編譯器會自動對block進行copy操作落午。
8.控制器什么時候不會被釋放?
Block循環(huán)引用,代理循環(huán)引用那婉,NSTimer未銷毀
9.分類如何增加屬性。
10.內(nèi)存五大區(qū)域党瓮,沙盒內(nèi)容详炬,有什么作用?單例聲明的對象存儲在哪里?
第二部分:UI布局以及網(wǎng)絡相關(guān)
1.橫向兩個label保證右邊寬度。
UILabel *leftLabel = [[UILabel alloc]init];? ?
leftLabel.text = @"動器萬德福千動器萬動器萬德福千動器萬動器萬德福千動器萬動器萬德福千動器萬動器萬德福千動器萬動器萬德福千動器萬";? ?
leftLabel.backgroundColor = [UIColor redColor];? ?
[self.view addSubview:leftLabel];?? ?? ?
UILabel *rightLabel = [[UILabel alloc]init];? ?
rightLabel.text = @"3D3D3D3D3D3D3D3D3D3D3D3D3D";? ?
rightLabel.backgroundColor = [UIColor grayColor];? ?
[self.view addSubview:rightLabel];?? ?? ?
[leftLabel mas_makeConstraints:^(MASConstraintMaker *make) {? ? ? ? make.top.equalTo(self.view.mas_top).with.offset(50);? ?
make.left.equalTo(self.view.mas_left).with.offset(2);? ? ? ?
make.height.equalTo(@40);? ? ? ??
make.width.mas_greaterThanOrEqualTo(300);? ? //防止因為右邊的label過寬導致左邊被擠沒了
}];? ?
[rightLabel mas_makeConstraints:^(MASConstraintMaker *make) {? ? ? ? make.left.equalTo(leftLabel.mas_right).with.offset(2);? ? ? ? make.top.equalTo(self.view.mas_top).with.offset(50);? ? ? ? make.right.equalTo(self.view.mas_right).with.offset(-2);? ? ? ?
make.height.equalTo(@40);? ? ?
}];
//讓右邊的label抗壓縮的等級比左邊高,更加不容易被拉伸!
?[rightLabel setContentCompressionResistancePriority:UILayoutPriorityRequired?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? forAxis:UILayoutConstraintAxisHorizontal];