iOS常見基本問題整理 (II)

1.怎麼理解MVC,在Cocoa中MVC是怎麼實現的?

MVC設計模式考慮三種對象:模型、視圖、和控制器。模型對象代表特別的知識和專業技能,它們負責保有應用程序的數據和定義操作數據的邏輯。視圖對象知道如何顯示應用程序的模型數據,而且可能允許用戶對其進行編輯。控制器對象是應用程序的視圖對象和模型對象之間的協調者。

2.__block和__weak修飾符的區別

1.__block不管是ARC還是MRC模式下都可以使用,可以修飾對象,還可以修飾基本數據類型。 

2.__weak只能在ARC模式下使用,也只能修飾對象(NSString),不能修飾基本數據類型(int)。 

3.__block對象可以在block中被重新賦值,__weak不可以。 

3.delegate與notification的區別 

1、二者都用於傳遞消息,不同之處主要在於一個是一對一的,另一個是一對多的。

2、notification通過維護一個array,實現一對多消息的轉發。

3、delegate需要兩者之間必須建立聯繫,並且reciever可以返回值給sender;notification不需要兩者之間有聯繫,reciever無法返回值給sender。delegate用於sender希望接受到reciever的某個功能反饋值,notification用於通知多個object某個事件。

4.理解KVC(NSKeyValueCoding)與KVO(Key-Value-Observing)(鍵-值-編碼與鍵-值-監看)

KVC是NSKeyValueCoding的縮寫,是一個非正式的Protocol。是一種可以直接通過字符串的名字(key)來訪問類屬性的機制,而不是通過調用的Setter、Getter方法訪問。KVO 就是基於 KVC 實現的關鍵技術之一。

KVO是NSKeyValue Observe的縮寫,中文是鍵值觀察。這是一個典型的觀察者模式,觀察者在鍵值改變時會得到通知。iOS中有個Notification的機制,也可以獲得通知,但這個機制需要有個Center,相比之下KVO更加簡潔而直接。

5.id、nil代表什麼?

id:id和void *並非完全一樣。id是指向struct objc_object的一個指針,這個意思基本上是說,id是一個指向任何一個繼承了Object(或者NSObject)類的對象。需要注意的是id是一個指針,所以你在使用id的時候不需要加星號。比如id foo=nil定義了一個nil指針,這個指針指向NSObject的一個任意子類。而id *foo=nil則定義了一個指針,這個指針指向另一個指針,被指向的這個指針指向NSObject的一個子類。

nil:nil和C語言的NULL相同,在objc/objc.h中定義。nil表示一個Objctive-C對象,這個對象的指針指向空(沒有東西就是空)。

6.sprintf,strcpy,memcpy使用上有什麼要注意的地方 

strcpy是一個字符串拷貝的函數,它的函數原型爲strcpy(char *dst, const char *src); 將 src開始的一段字符串拷貝到dst開始的內存中去,結束的標誌符號爲'\0',由於拷貝的長度不是由我們自己控制的,所以這個字符串拷貝很容易出錯。

memcpy,這是一個內存拷貝函數,它的函數原型爲memcpy(void *dest, const void *src, size_t len); 將長度爲len的一段內存,從src拷貝到dst中去,這個函數的長度可控。但是會有內存疊加的問題。 

sprintf是格式化函數。將一段數據通過特定的格式,格式化到一個字符串緩衝區中去。sprintf格式化的函數的長度不可控,有可能格式化後的字符串會超出緩衝區的大小,造成溢出。 

7.自動釋放池是什麼,如何工作 

當你向一個對象發送一個autorelease消息時,Cocoa就會將該對象的一個引用放入到最新的自動釋放池。它仍然是個正當的對象,因此自動釋放池定義的作用域內的其它對象可以向它發送消息。當程序執行到作用域結束的位置時,自動釋放池就會被釋放,池中的所有對象也就被釋放。 

1.  ojc-c 是通過一種"referring counting"(引用計數)的方式來管理內存的, 對象在開始分配內存(alloc)的時候引用計數爲一,以後每當碰到有copy,retain的時候引用計數都會加一, 每當碰到release和autorelease的時候引用計數就會減一,如果此對象的計數變爲了0, 就會被系統銷燬. 

2. NSAutoreleasePool 就是用來做引用計數的管理工作的,這個東西一般不用你管的. 

3. autorelease和release沒什麼區別,只是引用計數減一的時機不同而已,autorelease會在對象的使用真正結束的時候才做引用計數減一. 

8.類別的作用

類別主要有3個作用:

(1)將類的實現分散到多個不同文件或多個不同框架中。

(2)創建對私有方法的前向引用。

(3)向對象添加非正式協議。

類別的侷限性,有兩方面侷限性:

(1)無法向類中添加新的實例變量,類別沒有位置容納實例變量。

(2)名稱衝突,即當類別中的方法與原始類方法名稱衝突時,類別具有更高的優先級。類別方法將完全取代初始方法從而無法再使用初始方法。

無法添加實例變量的侷限可以使用字典對象解決



發佈了27 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章