現在進入本篇的正題。本篇的面試題是我認為比較好的iOS開發基礎知識點,希望大家看過這后在理解的基礎上掌握而不是死記硬背。死記硬背很快也會忘記的。
1 iOS基礎
1.1 父類實現深拷貝時,子類如何實現深度拷貝。父類沒有實現深拷貝時,子類如何實現深度拷貝。
- 1 深拷貝和淺拷貝的區別:淺拷貝是指針的拷貝,對一個對象的淺拷貝,相當于對一個指針的復制,即兩個指針同時指向一個內存地址,對象銷毀后兩個指針應該同時滯空。深拷貝是對一個對象進行拷貝,相當于對對象進行復制,產生一個新的對象,那么就有兩個指針分別指向兩個對象。當一個對象改變或者被銷毀后拷貝出來的新的對象不受影響。
- 2 實現深拷貝需要實現NSCoying協議,實現- (id)copyWithZone:(NSZone *)zone 方法。當對一個property屬性含有copy修飾符的時候,在進行賦值操作的時候實際上就是調用這個方法。父類實現深拷貝之后,子類只要重寫copyWithZone方法,在方法內部調用父類的copyWithZone方法,之后實現自己的屬性的處理。父類沒有實現深拷貝,子類除了需要對自己的屬性進行處理,還要對父類的屬性進行處理。
1.2 KVO,NSNotification,delegate及block區別 - 1 KVO就是cocoa框架實現的觀察者模式,一般同KVC搭配使用,通過KVO可以監測一個值的變化,比如View的高度變化。是一對多的關系,一個值的變化會通知所有的觀察者。
- 2 NSNotification是通知,也是一對多的使用場景。在某些情況下,KVO和NSNotification是一樣的,都是狀態變化之后告知對方。NSNotification的特點,就是需要被觀察者先主動發出通知,然后觀察者注冊監聽后再來進行響應,比KVO多了發送通知的一步,但是其優點是監聽不局限于屬性的變化,還可以對多種多樣的狀態變化進行監聽,監聽范圍廣,使用也更靈活。
- 3 delegate 是代理,就是我不想做的事情交給別人做。比如狗需要吃飯,就通過delegate通知主人,主人就會給他做飯、盛飯、倒水,這些操作,這些狗都不需要關心,只需要調用delegate(代理人)就可以了,由其他類完成所需要的操作。所以delegate是一對一關系。
- 4 block是delegate的另一種形式,是函數式編程的一種形式。使用場景跟delegate一樣,相比delegate更靈活,而且代理的實現更直觀。
KVO一般的使用場景是數據,需求是數據變化,比如股票價格變化,我們一般使用KVO(觀察者模式)。delegate一般的使用場景是行為,需求是需要別人幫我做一件事情,比如買賣股票,我們一般使用delegate。
Notification一般是進行全局通知,比如利好消息一出,通知大家去買入。delegate是強關聯,就是委托和代理雙方互相知道,你委托別人買股票你就需要知道經紀人,經紀人也不要知道自己的顧客。Notification是弱關聯,利好消息發出,你不需要知道是誰發的也可以做出相應的反應,同理發消息的人也不需要知道接收的人也可以正常發出消息。
1.3 將一個函數在主線程執行的4種方法
EB9B160A-713A-40DC-917E-74AFAF3DA160.png
1.4 如何讓計時器調用一個類方法
計時器只能調用實例方法,但是可以在這個實例方法里面調用靜態方法。
使用計時器需要注意,計時器一定要加入RunLoop中,并且選好model才能運行。scheduledTimerWithTimeInterval方法創建一個計時器并加入到RunLoop中所以可以直接使用。
如果計時器的repeats選擇YES說明這個計時器會重復執行,一定要在合適的時機調用計時器的invalid。不能在dealloc中調用,因為一旦設置為repeats 為yes,計時器會強持有self,導致dealloc永遠不會被調用,這個類就永遠無法被釋放。比如可以在viewDidDisappear中調用,這樣當類需要被回收的時候就可以正常進入dealloc中了。
1.5 如何重寫類方法 - 1 在子類中實現一個同基類名字一樣的靜態方法
- 2 在調用的時候不要使用類名調用,而是使用[self class]的方式調用。原理,用類名調用是早綁定,在編譯期綁定,用[self class]是晚綁定,在運行時決定調用哪個方法。
1.6、多線程在實際現實中有哪些應用?(網絡操作和大量圖片處理不算) - 1 通常耗時的操作都會放在子線程里處理,然后再回到主線程來顯示。下面舉幾個例子:
- 2 我們要從數據庫提取數據還要將數據分組后顯示,那么就會開個子線程來處理,處理完成后才去刷新UI顯示。
- 3 拍照后,會在子線程處理圖片,完成后才回到主線程來顯示圖片。拍照出來的圖片太大了,因此要做處理。
- 4 音頻、視頻處理會在子線程來操作
- 5 文件較大時,文件操作會在子線程中處理
- 6 做客戶端與服務端數據同步時,會在后臺閑時自動同步
**1.7readwrite,readonly,assign,retain,copy,nonatomic屬性的作用 **
@property是一個屬性訪問聲明,擴號內支持以下幾個屬性: - 1 getter=getterName,setter=setterName,設置setter與getter的方法名
- 2 readwrite,readonly,設置可供訪問級別
- 3 assign,setter方法直接賦值,不進行任何retain操作,為了解決原類型與環循引用問題
- 4 retain,setter方法對參數進行release舊值再retain新值,所有實現都是這個順序
- 5 copy,setter方法進行Copy操作,與retain處理流程一樣,先舊值release,再Copy出新的對象,retainCount為1。這是為了減少對上下文的依賴而引入的機制。
copy是在你不希望a和b共享一塊內存時會使用到。a和b各自有自己的內存.
1.7、什么是UDP和TCP的區別是什么?
TCP 的全稱是傳輸控制協議,這種協議可以提供面向連接的、可靠的、點到點的通信。
UDP 的全稱是用戶數據包協議。他可以提供非連接的不可靠的點懂啊多點的通信,是osi參考模型中一種無連接的傳輸層協議,提供面向事務的簡單的不可靠信息傳輸,_IETF RFC 768 是UDP 的正式規范;
選擇何種協議,看程序注重那個方面,可靠抑或快速。
TCP/IP 建立連接的過程?
在TCP/IP 協議中,TCP協議提供可靠的連接服務,采用三次握手建立連接;
第一次握手:建立連接時,客戶端發送連接請求到服務器,并進入SYN_SEND狀態,等待服務器確認;
第二次握手:服務器收到客戶端連接請求,向客戶端發送允許連接應答,此時服務器進入SYN_RECV狀態;
第三次握手:客戶端收到服務器的允許連接應答,向服務器發送確認,客戶端和服務器進入通信狀態,完成三次握手。
(所謂的三次握手,就是要有三次連接信息的發送、接收過程。TCP連的建立需要進行三次連接信息的發送、接收。)