1. 程式人生 > >18、iOS面試題·自整理·One

18、iOS面試題·自整理·One

新特性 服務器端 ssd 關閉 綁架 利好 pla ken 技巧

如何解決低內存問題?

ForExample:將暫時沒有展示在Window中的界面銷毀,以獲得足夠的內存;


POST請求的數據類型有哪些?

json、xml、二進制、參數拼接;


請簡述你理解的面向對象思想。

所謂面向對象,舉個最簡單的例子,就是這樣的。

A先生需要一臺電腦,但是A先生對電腦配置、性能、品牌等方方面面的知識一竅不通。而A先生恰巧有位經營電腦方面生意的朋友——C先生,C先生對電腦硬件方面很是了解。A先生告訴C先生所需要的電腦大概什麽需求、什麽價位。C先生就會提供給A先生其所需的電腦。至於中間篩選、購買、討價還價的過程什麽的,A先生完全不用管任何一個環節。只需要付費,就能拿到所需的電腦。


iOS中frame和bounds的區別?

frame指的是:該view在父view坐標系統中的位置和大小。(參照點是父親的坐標系統)

bounds指的是:該view在本身坐標系統中的位置和大小。(參照點是本身坐標系統)


請簡述你理解的內存管理。

如果你通過分配和初始化(比如[[XXXClass alloc] init])的方式來創建對象,你就擁有這個對象,需要負責該對象的釋放。這個規則在使用NSObject的便利方法new時,也同樣適用。

如果你拷貝一個對象,你也擁有拷貝得到的對象,需要負責該對象的釋放。

如果你保持一個對象,你就部分擁有這個對象,需要在以後都不再使用的時候釋放該對象。

如果你從其他對象那裏接收到一個對象,則你不擁有該對象,也不應該釋放它。


如何設計一個緩存類?

在程序中使用緩存可以極大的提高程序的運行速度,設計一個簡單的緩存類並不需要太復雜的邏輯.

簡單的只需要3個接口.

1.存對象

2.取對象

3.刪除對象

讀取對象

·讀取對象的時候先讀內存

·內存沒有就讀文件

保存對象

·保存對象的時候前臺保存到內存裏

·後臺存入到文件裏

·內存空間不足就需要先釋放一塊內存

·收到內存不足的消息的時候刪除釋放所有的內存


iOS9.0都有哪些新特性?

1.網絡適配-Https

2.後臺定位

3.CoreSpotlightSearch

4.User-Interface-Testing用戶交互

5.UIStackView

6.Contacts-Framework獲取通訊錄

7.白名單

8.多任務,iPad分屏

9.UIKit-Dynamics

10.MapKit

11.GameplayKit-Pathfinding

12.GameplayKit-Behaviors

13.CloudKit-Web-Service


什麽是懶加載?

懶加載就是懶漢模式,只有用到的時候才回去初始化。也可以理解為延時加載。

舉個最簡單的例子:tableView中圖片的加載顯示。

一個延時加載,避免內存過高;一個異步加載,避免線程阻塞。


如何進行網絡消息推送?APNS推送(蘋果推送服務)的實現過程?APSN和第三方相比有何區別?

首先應用發送通知,系統彈出提示框詢問用戶是否允許,當用戶允許後向蘋果服務器(APNS)請求deviceToken,並由蘋果服務器發送給自己的應用,自己的應用將DeviceToken發送給自己的服務器,自己的服務器想要發送網絡推送時將deviceToken以及想要推送的信息發送給蘋果服務器,蘋果服務器將信息發送給應用。

推送信息內容,總容量不超過256個字節;

iOSSDK本身提供的APSN服務器推送,它可以直接推送給目標用戶並根據您的方式彈出提示。

優點:不論應用是否開啟,都會發送到手機端;

缺點:消息推送機制是蘋果服務器端控制,個別時候可能會有延遲,因為蘋果服務器也有隊列來處理所有的消息請求;

第三方推送機制,普遍使用Socket機制來實現,幾乎可以達到及時的發送到目標用戶手機端,適用於即時通訊類應用。

優點:實時的,取決於心跳包的節奏;

缺點:iOS系統的限制,應用不能長時間的後臺運行,所以應用關閉的情況下這種推送機制不可用。


添加NSNotificationCenter監聽,其後面的object的意義是什麽?

用NSNotificationCenter添加監聽者,其後面的object的意義是:監聽同一條通知的多個觀察者,在通知到達時,它們執行回調的順序是不確定的,所以我們不能去假設操作的執行會按照添加觀察者的順序來執行。


論Socket和HTTP協議的區別。

HTTP協議是基於TCP連接的,是應用層協議,主要是解決如何包裝數據。

Socket是對TCP/IP協議的封裝,Socket本身並不是協議,而是一個調用接口(API),通過Socket,我們才能使用TCP/IP協議。

HTTP連接:短連接,客戶端向服務器發送一次請求,服務器響應後連接斷開,節省資源。服務器不能主動給客戶端響應(除非采用HTTP長連接技術),iPhone主要使用類NSURLConnection。

Socket連接:長連接,客戶端跟服務器端直接使用Socket進行連接,沒有規定連接後斷開,因此客戶端和服務器保持連接通道,雙方可以主動發送數據,一般多用於遊戲。

Socket默認連接超時時間是30秒,默認大小是8K(理解為一個數據包大小)。


iOS中數據的持久化存儲方式有哪些?

數據存儲的核心都是寫文件。

屬性列表:只有NSString、NSArray、NSDictionary、NSData可writeToFile,存儲依舊是plist文件。

Plis文件可以存儲的7種數據類型:array、dictionary、string、bool、data、number。

對象序列化(對象歸檔):對象序列化通過序列化的形式,鍵值關系存儲到本地,轉化成二進制流。通過runtime實現自動歸檔/解檔。

1.編碼(對象序列化):把不能直接存儲到plist文件中的數據,轉化為二進制數據NSData,可以存儲到本地;

2.解碼(對象反序列化):把二進制數據轉化為本來的類型。


什麽是KVC/KVO?它們之間有什麽關系?

數據存儲的核心都是寫文件。

kvc:鍵-值編碼,是一種間接訪問對象的屬性使用字符串來標識屬性,而不是通過調用存取方法,直接或通過實例變量訪問的機制。

很多情況下可以簡化程序代碼。Apple文檔其實給了一個很好的例子。

kvo:鍵值觀察機制,它提供了觀察某一屬性變化的方法,極大的簡化了代碼。

具體看到用到過的一個地方是對於按鈕點擊變化狀態的監控。


請簡述服務器連接三次握手。

第一次握手:客戶端發送syn包(syn=j)到服務器,並進入SYN_SEND狀態,等待服務器確認;

第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同事自己也發送一個SYN包,即SYN+ACK包,此時服務器進入SYN+RECV狀態;

第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次狀態。


層CALayer和UIView的區別是什麽?

兩者最大的區別是:圖層不會直接渲染到屏幕上。UIView是iOS系統中界面元素的基礎,所有的界面元素都是繼承自它。它本身完全是由CoreAnimation來實現的。它真正的繪圖部分,是由一個CALayer類來管理。UIView本身更像是一個CALayer的管理器。一個UIView上可以有N個CALayer,每個layer顯示一種東西,增強UIView的展現能力。

UIView可以響應用戶事件,因為它繼承自UIResponder。

1.其實UIView之所以能顯示在屏幕上,完全是因為它內部的一個圖層(即CALayer對象);

2.UIView本身不具備顯示功能,是它內部的層才有顯示功能;

3.UIView創建對象時,UIVIew內部會自動創建一個圖層

(CALayer對象)通過UIVIew的layer屬性可以訪問這個層。

4.當UIView需要顯示到屏幕上時:

4.1.會調用drawRect:方法進行繪圖,並且會將所有內容繪制在自己的圖層layer屬性上;

4.2.繪圖完畢後,系統會將圖層拷貝到屏幕上,於是完成了UIView的顯示。


nil、Nil、NULL區別是什麽?id和void *區別是什麽?

NULL:是對於C語言的指針而使用的,表示空指針;

nil:對於OC中的對象而使用的,表示對象為空;

Nil:對於OC中的類而使用的,表示類指向空。

id:OC中指針,可以指向所有類型的對象,它是泛型對象指針。

void*:C/C++中的泛型指針。


◆Objective-C使用什麽機制管理對象內存?

通過retainCount的機制來決定對象是否需要釋放。每次runloop的時候,都會檢查對象的retainCount,如果retainCount為0,說明該對象沒有地方需要繼續使用了,可以釋放掉了(會被系統自動釋放)。


◆ARC通過什麽方式幫助開發者管理內存?

編譯時根據代碼上下文,插入retain/release。


◆不手動指定autoreleasepool的前提下,一個autorelease對象在什麽時刻釋放?(比如在一個ViewController的viewDidload中創建)

分兩種情況:手動幹預釋放時機、系統自動去釋放。

1.手動敢於釋放時機——指定autoreleasepool就是所謂的:當前作用於大括號結束時釋放。

2.系統自動去釋放——不手動指定autoreleasepool

Autorelease對象會在當前的runloop叠代結束時釋放。

如果在一個ViewController的viewDidload中創建一個Autorelease對象,那麽該對象會在viewDidAppear方法執行前就被銷毀了。


◆lldb(gdb)常用的調試命令?

·breakpoint設置斷點定位到某一個函數

·n斷點指針下一步

·po打印對象


◆InterfaceBuilder中UserDefinedRuntimeAttributes如何使用?

它能夠通過kvc的方式配置一些你在interfacebuilder中不能配置的屬性。當你希望在InterfaceBuilder中做盡可能多的事情,這個特性能夠幫助你編寫更加輕量級的viewController。


這段代碼有問題嗎?如何修改?

for (int i = 0; i < 10000; ++i) {

NSString *str = @"Abc";

str = [str lowercaseString];

str = [str stringByAppendingString:@"xyz"];

NSLog(@"%@", str);

}


從語法上看,沒有任何問題。

但是,確實存在問題。這裏考量的是iOS的自動釋放池的原理或者說內存管理。

實際,這段代碼的問題就是:內存得不到及時的釋放。

為什麽得不到及時地釋放?

因為RunLoop是每個事件循環結束後才會自動釋放池去使對象的引用計數減一,對於引用計數為零的對象才會真正被銷毀、回收內存。

因此,對於此處的問題。一個for循環執行10000次,會產生10000個臨時自動番話對象,一直放到自動釋放池中管理,內存得不到回收。

然後,現象是:內存暴漲。


正確的寫法是:

for (int i = 0; i < 10000; ++i) {

@autoreleasepool {

NSString *str = @"Abc";

str = [str lowercaseString];

str = [str stringByAppendingString:@"xyz"];

NSLog(@"%@", str);

}

}


UITableview是如何重用cell的?

UITableview提供了一個屬性:visibleCells,它是記錄但潛在屏幕課件的cell,要想重用cell,我們需要明確指定重用標識(identifier)。

當cell滾動出TableView可視範圍之外時,就會被放到可重用數組中。當有一個cell滾動出TableView可視範圍之外時,同樣也會有新的cell要顯示到TableView可視區,因此這個新小時出來的cell就會先從可重用數組中通過所指定的identifier來獲取,如果能夠獲取到,則直接使用之,否則創建一個新的cell。


如何更高效地顯示列表?

要更高效地顯示列表(不考慮種種優化),可以通過以下方法處理(只是部分):

·提前根據數據計算好高度並緩存起來;

·提前將數據處理、I/O計算異步處理好,並保存結果,在需要時直接拿來使用。


http狀態碼查詢

2XX成功狀態碼

200OK服務器成功處理了請求(這個是我們見到最多的)

4XX客戶端錯誤狀態碼

400BadRequest(壞請求) 告訴客戶端,它發送了一個錯誤的請求

403 Forbidden(禁止)請求被服務器拒絕了

404 NotFound(未找到)未找到資源

408 RequestTimeout(請求超時)如果客戶端完成請求時花費的時間太長,服務器可以回送這個狀態碼並關閉連接

414 RequestURLTooLong(請求URL太長) 客戶端發送的請求所攜帶的URL超過了服務器能夠或者希望處理的長度

5XX服務器錯誤狀態碼

500 InternetSeverError(內部服務器錯誤)服務器遇到一個錯誤,使其無法為請求提供服務

501Not Implement(未實現) 客戶端發起的請求超出服務的能力範圍(比如,使用了服務器不支持的請求方法)時,使用此狀態碼

502 BadGateway(網關故障)代理使用的服務器遇到了上遊的無效響應

503 ServiceUnavailable(未提供此服務)服務器目前無法為請求提供服務,但過一段時間就可以恢復服務

504GatewayTimeout(網關超時)與狀態碼408類似,但是響應來自網關或代理,此網關或代理在等待另一臺服務器的響應時出現了超時服務器

505 HTTPVersionNotSupported(不支持的HTTP版本)服務器收到的請求使用了它不支持的HTTP協議版本。有些服務器不支持HTTP早期的HTTP協議版本,也不支持太高的協議版本


單例模式的理解

單例模式是一種常用設計模式,單例模式是一個類在系統中只有一個實例對象。通過全局的一個入口點對這個實例對象進行訪問;

iOS中單例模式的實現方式一般分為兩種:非ARC和ARC+GCD。


如何理解MVVM設計模式

ViewModel層,就是View和Model層的粘合劑,它是一個放置用戶輸入驗證邏輯,視圖顯示邏輯,發起網絡請求和其他各種各樣的代碼的記號的地方。說白了,就是把原來ViewController層的業務邏輯和頁面邏輯等剝離出來放到ViewModel層。

View層,就是ViewController,它的任務就是從ViewModel層獲取數據,然後顯示。


關於Bitcode

問題描述:iOS新建項目默認需要支持bitcode,而不支持bitcode的SDK會導致無法編譯運行。大部分社交平臺SDK不支持bitcode。

解決方案:

1、暫時關閉對bitcode的支持(建議),方法:選中工程文件-->選中project下的工程名-->Build Settings-->找到BuildOptions-->Enable Bitcode-->置為NO,即可。

2、移除不支持bitcode的平臺SDK。

33.Objective-C中是否支持垃圾回收機制?

Objective-C是支持垃圾回收機制的(Garbagecollection簡稱GC),但是apple得移動終端中,是不支持GC的,Mac桌面系統開發中是支持的。

移動終端開發是支持ARC(AutomaticReferenceCounting的簡稱),ARC在iOS5之後推出的新技術,它與GC的機制是不同的。我們在編寫代碼時,不需要向對象發送release或者autorelease方法,也不可以調用delloc方法,編譯器會在合適的位置自動給用戶生成release消息(autorelease),ARC的特點是自動引用計數簡化了內存管理的難度。


對於RunLoop的理解

Runloop,是多線程的法寶,即一個線程一次只能執行一個任務,執行完任務後就會退出線程。主線程執行完即時任務時會繼續等待接收事件而不退出。非主線程通常來說就是為了執行某一任務的,執行完畢就需要歸還資源,因此默認是不運行Runloop的;

每一個線程都有其對應的Runloop,只是默認只有主線程的Runloop是啟動的,其他子線程的Runloop默認是不啟動的,若要啟動則需要手動啟動;

在一個單獨的線程中,如果需要在處理完某個任務後不退出,繼續等待接收事件,則需要啟用Runloop;

NSRunloop提供了一個添加NSTimer的方法,可以指定Mode,如果要讓任何情況下都回調,則需要設置Mode為Common模式;

實質上,對於子線程的Runloop默認是不存在的,因為蘋果采用了懶加載的方式。如果我們沒有手動調用[NSRunloopcurrentRunloop]的話,就不會去查詢是否在當前線程的Runloop,也就不回去加載,更不會創建。


什麽是安全釋放?

先釋放再置空。


GCD內部怎麽實現的?

1.iOS和OSX的核心是XNU內核,GCD是基於XNU內核實現的

2.GCD的API全部在libdispatch庫中

3.GCD的底層實現主要有DispatchQueue和DispatchSource

DispatchQueue:管理block(操作)

DispatchSource:處理事件


KVO內部實現原理?

1.KVO是基於runtime機制實現的;

2.當某個類的對象第一次被觀察時,系統就會在運行期動態的創建該類的一個派生類,在這個派生類中重寫基類中任何被觀察屬性的setter方法。派生類在被重寫setter方法中實現了真正的通知機制。(Person-->NSKVONotificationPerson)


iOS應用的調試技巧?

1.如遇到crash,分析崩潰日誌(symbolicatedrash工具的適用)保留崩潰版本的.dSYM文件;

2.在Xcode中進入斷點管理窗口,然後點擊右下方的+,增加新的ExceptionBreakpoint;

3.如遇到EXC_BAD_ACCESS,打開Scheme選項選擇EditScheme。然後勾上EnableZombie和MallocStack那兩項;

4.有效的日誌管理。NSLog和加入一些開源的日誌管理框架;

5.程序斷點debug模式。


iOS應用程序性能的調優

1.用ARC去管理內存;

2.適當的地方使用reuseIdentifier;

3.盡可能設置視圖為不透明;

4.避免臃腫的Xibs文件;

5.不要阻塞主線程;

6.調整圖像視圖中的圖像尺寸;

7.選擇正確合集;

8.啟用Gzip壓縮;

9.重用和延遲加載視圖;

10.使用緩存;

11.考慮使用繪圖;

12.處理內存警告;

13.重(chong)用大開銷對象;

14.使用SpriteSheets(sprite sheet主要是由N個圖像組合成的一個大的圖像,這個大的圖像裏面包括了一個完整動畫的所有幀,使用一個大圖片的好處就是減少讀取次數,在一定數量的情況下,sprite sheet有很明顯的優勢:

1.更小的文件尺寸

2.更快的打開速度

3.在FP11的時代可以借助STARTLING以便得到GPU的加速支持

);

15.避免重復處理數據;

16.選擇正確的數據格式;

17.適當得設置背景圖片;

18.減少你的網絡占用;

19.設置陰影路徑;

20.優化你的表格視圖;

21.選擇正確的數據存儲方式;

22.加速啟動時間;

23.使用自動釋放池;

24.緩存圖像;

25.盡可能避免日期格式化。


UIScrollView的contentSize、contentOffSet和contentInset屬性的區別

contentSize表示UIScrollView滾動區域的大小。UIScrollView的frame屬性在設置好了以後不會隨內容的變化而變化;

contentOffSet表示是UIScrollView當前顯示區域定點相對於frame頂點的偏移量,一般用來設置UIScrollView顯示的位置;

contentInset表示是scrollView的contentView的頂點相對於scrollView的位置,假設你的contentInset=(0,100),那麽你的contentView就是從scrollView的(0,100)開始顯示。一般都是(0,0)表示從scrollView的開始顯示。


描述程序啟動的順序

1.main.m是程序的入口;

2.UIApplicationMain()創建應用程序對象,並且為此對象指定委托,檢測程序的運行,同時開啟事件循環,處理程序接收到的事件;

3.UIApplicationDeletegate方法的執行;

4.加載window;

5.指定根視圖控制器;

6.在指定的視圖控制器中添加控件,實現應用程序界面;


介紹一下XMPP?有什麽優缺點嗎?

XMPP(Extensible Messaging and Presence Protocol,前稱)是一種以XML為基礎的開放式實時通信協議,是 經由互聯網工程工作小組(IETF)通過的互聯網標準。簡單的說,XMPP就是一種協議,一種規定。就是說,在網絡上傳 東西,要建立連接,TCP/IP連接,建立後再傳東西,而XMPP就是規定你傳的東西的格式。XMPP是基於XML的協議。 優點開放:

XMPP協議是自由、開放、公開的,並且易於了解。 而且在客戶端 、 服務器 、 組件 、 源碼庫等方面,都已經各自有多種實現。 標準:

互聯網工程工作小組( IETF )已經將Jabber的核心XML流協議以XMPP之名,正式列為認可的實時通信及Presence技術。 而XMPP的技術規格已被定義在RFC 3920及RFC 3921 。 任何IM供應商在遵循XMPP協議下,都可與Google Talk實現連接。 證實可用:

第一個Jabber(現在XMPP)技術是Jeremie Miller在1998年開發的,現在已經相當穩定;數以百計的開發者為XMPP技術而努 力。 今日的互聯網上有數以萬計的XMPP服務器運作著,並有數以百萬計的人們使用XMPP實時傳訊軟件。分散式:

XMPP網絡的架構和電子郵件十分相像;XMPP核心協議通信方式是先創建一個stream,XMPP以TCP傳遞XML數據流,沒有 中央主服務器。 任何人都可以運行自己的XMPP服務器,使個人及組織能夠掌控他們的實時傳訊體驗。安全:

任何XMPP協議的服務器可以獨立於公眾XMPP網絡(例如在企業內部網絡中),而使用SASL及TLS等技術的可靠安全性,已自 帶於核心XMPP技術規格中。可擴展:

XML 命名空間的威力可使任何人在核心協議的基礎上建造定制化的功能;為了維持通透性,常見的擴展由XMPP標準基金會 。 彈性佳:

XMPP除了可用在實時通信的應用程序,還能用在網絡管理、內容供稿、協同工具、文件共享、遊戲、遠程系統監控等。 多樣性:

用XMPP協議來建造及布署實時應用程序及服務的公司及開放源代碼計劃分布在各種領域;用XMPP技術開發軟件,資源及支持的 來源是多樣的,使得使你不會陷於被“綁架”的困境。缺點數據負載太重:

隨著通常超過70%的XMPP協議的服務器的數據流量的存在和近60%的被重復轉發,XMPP協議目前擁有一個大型架空中存在的 數據提供給多個收件人。 新的議定書正在研究,以減輕這一問題。沒有二進制數據:XMPP協議的方式被編碼為一個單一的長的XML文件,因此無法提供修改二進制數據。 因此, 文件傳輸協議一樣使用外部的 HTTP。 如果不可避免,XMPP協議還提供了帶編碼的文件傳輸的所有數據使用的Base64 。 至於其他二進制數據加密會話 (encrypted conversations)或圖形圖標(graphic icons)以嵌入式使用相同的方法。


isKindOfClass和isMemberOfClass的聯系與區別

聯系:兩者都能檢測一個對象是否是某個類的成員

區別:isKindOfClass不僅用來確定一個對象是否是一個類的成員,也可以用來確定一個對象是否派生自該類的類的成員,而isMemberOfClass只能做到第一點

舉例:如ClassA派生自NSObject類,ClassA*a= [[ClassA alloc] init];,[a isKindOfClass:[NSObject class]]可以檢查出a是否是NSObject類派生類的成員,但isMemberOfClass做不到。


isKindOfClass、isMemberOfClass、selector作用分別是什麽?

isKindOfClass:某個對象屬於某個類型,包括繼承的類型;

isMemberOfClass:某個對象確切屬於某個類型,是不是具體的實例;

selector:通過方法名,獲取在內存中的函數的入口地址;


寫一個便利構造器

//id代表任意類型指針,這裏代表Student *,類方法

+(id)studentWithName:(NSString *)newName andAge:(int)newAge

{

Student *stu=[[Student alloc]initName:newName andAge:newAge];

return [stu autorelease];//自動釋放

}


列舉集中進程的同步機制,並比較其優缺點

原子操作信號量機制;

自旋鎖;

管程;

會合;

分布式系統;


進程之間通信的途徑

共享存儲系統消息傳遞系統管道:以文件系統為基礎;


進程死鎖的原因

資源競爭及進程推進順序非法;


死鎖的4個必要條件

互斥;

請求保持;

不可剝奪;

環路;


死鎖的處理

鴕鳥策略;

預防策略;

避免策略;

檢測與接觸死鎖;


使用block時什麽情況會發生引用循環,如何解決?

一個對象中強引用了block,在block中又強引用了該對象,就會發生循環引用;

解決方法是將該對象使用__weak或者__block修飾符修飾之後,再在block中使用;

1.id weak weakSelf = self;

或者weak__typeof(&*self)weakSelf = self該方法可以設置宏;

2.id __block weakSelf = self;

或者將一種以防強制制空xxx = nil;

檢測代碼中是否存在循環引用問題,可使用Facebook開源的一個檢測工具FBRetainCycleDetector;


一個Objective-C對象的isa的指針指向什麽?有什麽作用?

指向他的類對象,從而可以找到對象上的方法;


Objective-C中的類方法和實例方法有什麽本質區別和聯系?

類方法:

1.類方法是屬於類對象的;

2.類方法只能通過類對象調用;

3.類方法中的self是類對象;

4.類方法可以調用其他的類方法;

5.類方法中不能訪問成員變量;

6.類方法中不能直接調用對象方法;

實例方法:

1.實例方法是屬於實例對象的;

2.實例方法只能通過實例對象調用;

3.實例方法中的self是實例對象;

4.實例方法中可以訪問成員變量;

5.實例方法中直接點用實例方法;

6.實例方法中也可以調用類方法(通過類名);


◆KVO、NSNotification、delegate及block區別?

KVO就是cocoa框架實現的觀察者模式,一般同KVC搭配使用,通過KVO可以監測一個值的變化,比如View的高度變化。是一對多的關系,一個值的變化會通知所有的觀察者。

NSNotification是通知,也是一對多的使用場景。在某些情況下,KVO和NSNotification是一樣的,都是狀態變化之後告知對方。NSNotification的特點,就是需要被觀察者先主動發出通知,然後觀察者註冊監聽後再來進行響應,比KVO多了發送通知的一步,但是其優點是監聽不局限於屬性的變化,還可以對多種多樣的狀態變化進行監聽,監聽範圍廣,使用也更靈活。

delegate 是代理,就是我不想做的事情交給別人做。比如狗需要吃飯,就通過delegate通知主人,主人就會給他做飯、盛飯、倒水,這些操作,這些狗都不需要關心,只需要調用delegate(代理人)就可以了,由其他類完成所需要的操作。所以delegate是一對一關系。

block是delegate的另一種形式,是函數式編程的一種形式。使用場景跟delegate一樣,相比delegate更靈活,而且代理的實現更直觀。

KVO一般的使用場景是數據,需求是數據變化,比如股票價格變化,我們一般使用KVO(觀察者模式)。


delegate一般的使用場景是行為,需求是需要別人幫我做一件事情,比如買賣股票,我們一般使用delegate。

Notification一般是進行全局通知,比如利好消息一出,通知大家去買入。

delegate是強關聯,就是委托和代理雙方互相知道,你委托別人買股票你就需要知道經紀人,經紀人也不要知道自己的顧客。

Notification是弱關聯,利好消息發出,你不需要知道是誰發的也可以做出相應的反應,同理發消息的人也不需要知道接收的人也可以正常發出消息。

18、iOS面試題·自整理·One