1. 程式人生 > >ios 面試題 不定時更新

ios 面試題 不定時更新

Q1、Object-C有多繼承嗎?沒有的話用什麼代替?

A:沒有。多繼承即一個子類可以有多個父類,它繼承了多個父類的特性。多繼承在Objective-C中是用protocol 和delegate來實現的。
Q2、Object-C有私有方法嗎?私有變數呢?

A:Objective-C裡面的方法只有兩種,類方法和例項方法。所有例項變數預設都是私有的,所有例項方法預設都是公有的。
Q3、關鍵字const什麼含義?
A:意思是隻讀,也就是不能在別的地方修改用該關鍵字修飾的變數,一般用來定義一些常量。

Q4、關鍵字volatile有什麼含義?
A:一個定義為volatile的變數是說這變數可能會被意想不到地改變這樣編譯器就不會去假設這個變數的值了。精確地說就是優化器在用到 這個變數時必須每次都小心地重新讀取這個變數的值而不是使用儲存在暫存器裡的備份。

Q5、static作用?
A:static一般有2個作用,規定作用域和儲存方式。對於區域性變數,static規定其為靜態儲存方式,每次呼叫的初始值為上一次呼叫的值,呼叫結束後儲存空間不釋放;
對於全域性變數,如果以檔案劃分作用域的話,此變數只在當前檔案可見;對於static函式也是在當前模組內函式可見。

Q6、#import和#include的區別,@class代表什麼?
A:@class一般用於標頭檔案中需要宣告該類的某個例項變數的時候用到。

在m檔案中還是需要使用#import 。而#import比起#include的好處就是不會引起重複包含。

Q7、執行緒和程序的區別?
A:程序包含一到多個執行緒,而且至少包含一個執行緒(主執行緒)。
程序的所有執行緒共享相同的資源,包括記憶體空間等,比如全域性變數,程序的所有執行緒都能訪問。

Q8、堆和棧的區別?
A:管理方式:對於棧來講,是由編譯器自動管理,無需我們手工控制;對於堆來說,釋放工作由程式設計師控制,容易產生memory leak申請大小: 棧:棧是向低地址擴充套件的資料結構,是一塊連續的記憶體的區域

堆:是向高地址擴充套件的資料結構,是不連續的記憶體區域。

分配方式:堆都是動態分配的 ,動態分配由alloca函式進行分配

棧的動態分配由編譯器進行釋放,無需我們手工實現

Q9、Object-C的記憶體管理?
A:1.當你使用new,alloc和copy方法建立一個物件時,該物件的保留計數器值為1。當你不再使用該物件時,你要負責向該物件傳送一條release或autorelease訊息。這樣,該物件將在使用壽命結束時被銷燬.。

2.當你通過任何其他方法獲得一個物件時,則假設該物件的保留計數器值為1,而且已經被設定為自動釋放,你不需要執行任何操作來確保該物件被清理.如果你打算在一段時間內擁有該物件,則需要保留它並確保在操作完成時釋放它。

3.如果你保留了某個物件,你需要(最終)釋放或自動釋放該物件,必須保持retain方法和release方法的使用次數相等。

Q10、為什麼很多內建的類,如TableViewController的delegate的屬性是assign不是retain?
A:防止出現迴圈引用的問題。

Q11、定義屬性時,什麼情況使用copy、assign、retain?
A:assign用於簡單資料型別。如NSInteger,double,bool。

retain和copy用於物件。

copy用於當a指向一個物件。b也想指向同樣的物件的時候,如果用assigna如果釋放,再呼叫b會crash,如果用copy 的方式,a和b各自有自己的記憶體,就可以解決這個問題。

retain 會使計數器加一,也可以解決assign的問題。

另外,atomic和nonatomic用來決定編譯器生成的getter和setter是否為原子操作。在多執行緒環境下,原子操作是必要的,否則有可能引起錯誤的結果。 加了atomic,setter函式會變成下面這樣

 if (property != newValue)  {

 [property release];

property = [newValue retain];

}

Q12、物件是什麼時候被release的?
A:引用計數為0時。

Q13、iOS有沒有垃圾回收?
A:沒有垃圾回收,只有系統在應用程式退出的時候會在適當的時候回收所有的東西。ios5以後有arc,可以自動新增管理記憶體的程式碼,但與垃圾回收不是一個東西。一個需要自己管理,一個不需要。

Q14、tableView的重用機制?
A: ReuseIdentifier。

Q15、ViewController 的loadView、viewDidLoad、viewDidUnload分別是什麼時候呼叫的,在自定義ViewCointroller時在這幾個函式中應該做什麼工作?
A:loadView: 永遠不要主動呼叫這個函式。view controller會在view的property被請求並且當前view值為nil時呼叫這個函式。如果你手動建立view,你應該過載這個函式,且 不要在過載的時候呼叫[super loadview]。

viewDidLoad: 這個函式的作用主要是讓你可以進一步的初始化你的views。viewDidLoad通常負責的是view及其子view被載入進記憶體之後的資料初始化的工作,即檢視的資料部分的初始化。

 viewDidUnLoad: 這個函式是viewDidLoad的對立函式。在程式記憶體欠缺時,這個函式被controller呼叫,來釋放它的view以及view相關的物件。由於 controller通常儲存著view以及相關object的引用,所以你必須使用這個函式來放棄這些物件的所有權以便記憶體回收。但不要釋放那些難以重建的資料。(ios6.0以後不再使用)

viewWillAppear:檢視即將可見時呼叫。預設情況下不執行任何操作

viewDidAppear: 檢視已完全過渡到螢幕上時呼叫

viewWillDisappear:檢視被駁回時呼叫,覆蓋或以其他方式隱藏。預設情況下不執行任何操作

viewDidDisappear:檢視被駁回後呼叫,覆蓋或以其他方式隱藏。預設情況下不執行任何操作

didReceiveMemoryWarning:當程式記憶體過度時,系統會呼叫該方法

Q16、ViewController的didReceiveMemoryWarning是在什麼時候呼叫的?預設的操作是什麼?
A:在程式一次性申請大量記憶體或者申請的記憶體超過系統的可用記憶體時呼叫。預設操作時釋放沒用的view。

 View Controller會 釋放他自己的 Views。

Q17、列舉Cocoa中常見的集中多執行緒的實現,並談談多執行緒安全的幾種解決辦法,一般什麼地方會用到多執行緒?
A:NSThread,NSOperation,GCD。這三種程式設計方式抽象度層次是從低到高的,抽象度越高的使用越簡單,也是Apple最推薦使用的。

第一種方式對資料的操作要自己管理執行緒的生命週期和資料安全(加解鎖),後兩種方式只需要關心執行的操作。

Q18、怎麼理解MVC,在Cocoa中MVC是怎麼實現的?
A:Modal,View,Controller。

Model

描述的是你的程式是什麼,有哪些資料模型。

Controller

描述你的是model如何展現在使用者面前,controller控制如何在UI上展現model。

View

儘可能是view通用的,按鈕,滾動條等,決不能包含任何如何去表現的邏輯。controller用這些通用的view做model想要做的事情。

Q19、delegate和notification區別,分別在什麼情況下使用?
A:delegate方法往往需要關注返回值,也就是delegate方法的結果。相反的,notification最大的特色就是不關心接受者的態度,我只管把通告放出來,你接受不接受就是你的事情,同時我也不關心結果。

delegate的效率高於notification。delegate是一對一的使用,notification是一對多的使用。

Q20、id、nil代表什麼?
A:id表示任意型別。

nil表示物件為空。

Q21、類別的作用?
A:在應經定義好的方法中新增方法。

Q22. c和obj-c如何混用 .

A: 1) obj-c的編譯器處理字尾為m的檔案時,可以識別obj-c和c的程式碼, 處理mm檔案可以識別obj-c,c,c++程式碼,但cpp檔案必須只能用c/c++程式碼,而且cpp檔案include的標頭檔案中,也不能出現obj- c的程式碼,因為cpp只是cpp.

2) 在mm檔案中混用cpp直接使用即可,所以obj-c混cpp不是問題.

3)在cpp中混用obj- c其實就是使用obj-c編寫的模組是我們想要的。如果模組以類實現,那麼要按照cpp class的標準寫類的定義,標頭檔案中不能出現obj-c的東西,包括#import cocoa的。實現檔案中,即類的實現程式碼中可以使用obj-c的東西,可以import,只是字尾是mm。如果模組以函式實現,那麼標頭檔案要按 c的格式宣告函式,實現檔案中,c++函式內部可以用obj-c,但字尾還是mm或m。 

總結:只要cpp檔案和cpp include的檔案中不包含obj-c的東西就可以用了,cpp混用obj-c的關鍵是使用介面,而不能直接使用實現程式碼,實際上cpp混用的是 obj-c編譯後的o檔案,這個東西其實是無差別的,所以可以用。obj-c的編譯器支援cpp.

不定時更新

部分內容來源於網上,不能一一列出出處,請恕罪。