面試題

1、自動釋放池是什麼如何工作? 

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

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

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

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


2、類工廠方法是什麼? 

類工廠方法的實現是爲了向客戶提供方便,它們將分配和初始化合在一個步驟中,返回被創建的對象,並進行自動釋放處理。這些方法的形式是+ (type)className...(其中 className不包括任何前綴)。 

工廠方法可能不僅僅爲了方便使用。它們不但可以將分配和初始化合在一起,還可以爲初始化過程提供對 象的分配信息。 

類工廠方法的另一個目的是使類(比如NSWorkspace)提供單件實例。雖然init...方法可以確認一個類在每次程序運行過程只存在一個實例,但它需要首先分配一個“生的”實例,然後還必須釋放該實例工廠方法則可以避免爲可能沒有用的對象盲目分配內存。


3、單件實例是什麼?

Foundation 和 Application Kit 框架中的一些類只允許創建單件對象,即這些類在當前進程中的唯一實例。舉例來說,NSFileManager 和NSWorkspace 類在使用時都是基於進程進行單件對象的實例化。當向這些類請求實例的時候,它們會向您傳遞單一實例的一個引用,如果該實例還不存在,則首先進行實例的分配和初始化。單件對象充當控制中心的角色,負責指引或協調類的各種服務。如果類在概念上只有一個實例(比如 

NSWorkspace),就應該產生一個單件實例,而不是多個實例;如果將來某一天可能有多個實例,您可以使用單件實例機制,而不是工廠方法或函數。


4、obj-c的優缺點?

objc優點: 

  1) Cateogies 

  2) Posing 

  3) 動態識別 

  4) 指標計算 

  5)彈性訊息傳遞 

  6) 不是一個過度複雜的 C 衍生語言 

  7) Objective-C 與 C++ 可混合編程 

缺點: 

  1) 不支援命名空間 

  2)  不支持運算符重載 

  3)不支持多重繼承 

  4)使用動態運行時類型,所有的方法都是函數調用,所以很多編譯時優化方法都用不到。(如內聯函數等),性能低劣。 


5、sprintf,strcpy,memcpy使用上有什麼要注意的地方? 

strcpy是一個字符串拷貝的函數,它的函數原型爲strcpy(char *dst, c*****t char *src); 

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

將長度爲len的一段內存,從src拷貝到dst中去,這個函數的長度可控。但是會有內存疊加的問題。 

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


6、readwritereadonlyassignretaincopynonatomic屬性的作用 

@property是一個屬性訪問聲明,擴號內支持以下幾個屬性: 

1:getter=getterName,setter=setterName,設置setter與getter的方法名 

2:readwrite,readonly,設置可供訪問級別 

3:assign,setter方法直接賦值,不進行任何retain操作,爲了解決原類型與環循引用問題 

4:retain,setter方法對參數進行release舊值再retain新值,所有實現都是這個順序(CC上有相關資料) 

5:copy,setter方法進行Copy操作,與retain處理流程一樣,先舊值release,再Copy出新的對象,retainCount爲1。這是爲了減少對上下文的依賴而引入的機制。 

copy是在你不希望a和b共享一塊內存時會使用到。a和b各自有自己的內存。

6:nonatomic,非原子性訪問,不加同步,多線程併發訪問會提高性能。注意,如果不加此屬性,則默認是兩個訪問方法都爲原子型事務訪問。鎖被加到所屬對象實例級(我是這麼理解的...)。

atomic和nonatomic用來決定編譯器生成的getter和setter是否爲原子操作。在多線程環境下,原子操作是必要的,否則有可能引起錯 誤的結果。


7、什麼時候用delegate,什麼時候用Notification?答:delegate針對one-to-one關係,並且reciever可以返回值 sendernotification 可以針對one-to-one/many/none,reciever無法返回值給sender.所以,delegate用於sender希望接受到 reciever的某個功能反饋值,notification用於通知多個object某個事件。


8、什麼是KVCKVO

答:KVC(Key-Value-Coding)內部的實現:一個對象在調用setValue的時候,(1)首先根據方法名找到運行方法的時候所需要的環境參數。(2)他會從自己isa指針結合環境參數,找到具體的方法實現的接口。(3)再直接查找得來的具體的方法實現。KVOKey-Value- Observing):當觀察者爲一個對象的屬性進行了註冊,被觀察對象的isa指針被修改的時候,isa指針就會指向一箇中間類,而不是真實的類。所以 isa指針其實不需要指向實例對象真實的類。所以我們的程序最好不要依賴於isa指針。在調用類的方法的時候,最好要明確對象實例的類名。


9、ViewController  loadView, viewDidLoad, viewDidUnload 分別是在什麼時候調用的?

在自定義ViewController的時候這幾個函數裏面應該做什麼工作?答:viewDidLoadview nib文件初始化時調用,loadViewcontrollerviewnil時調用。此方法在編程實現view時調用,view 控制器默認會註冊memory warning notification,view controller的任何view 沒有用的時候,viewDidUnload會被調用,在這裏實現將retain view release,如果是retainIBOutlet view 屬性則不要在這裏release,IBOutlet會負責release 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章