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)名稱衝突,即當類別中的方法與原始類方法名稱衝突時,類別具有更高的優先級。類別方法將完全取代初始方法從而無法再使用初始方法。
無法添加實例變量的侷限可以使用字典對象解決