- 相關推薦
iPhone軟件開發面試題(2)
11.關鍵字volatile有什么含意?并給出三個不同的例子。
一個定義為 volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設這個變量的值了。精確地說就是,優化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用保存在寄存器里的備份。
下面是volatile變量的幾個例子:
并行設備的硬件寄存器(如:狀態寄存器)
一個中斷服務子程序中會訪問到的非自動變量(Non-automatic variables)
多線程應用中被幾個任務共享的變量
12.一個參數既可以是const還可以是volatile嗎?解釋為什么。一個指針可以是volatile 嗎?解釋為什么。
下面是答案:
一個例子是只讀的狀態寄存器。它是volatile因為它可能被意想不到地改變。它是const因為程序不應該試圖去修改它。
盡管這并不很常見。一個例子是當一個中服務子程序修該一個指向一個buffer的指針時。
13.為什么標準頭文件都有類似以下的結構?
#ifndef __INCvxWorksh
#define __INCvxWorksh
#ifdef __cplusplus
extern "C"
{
#endif
/*...*/
#ifdef__cplusplus
}
#endif
#endif /* __INCvxWorksh */
顯然,頭文件中的編譯宏 “#ifndef __INCvxWorksh、#define __INCvxWorksh、#endif” 的作用是防止該頭文件被重復引用。
14.#import 跟#include的區別,@class呢?
@class一般用于頭文件中需要聲明該類的某個實例變量的時候用到,在m文件中還是需要使用#import
而#import比起#include的好處就是不會引起交叉編譯
15.MVC 模式的理解
MVC設計模式考慮三種對象:模型對象、視圖對象和控制器對象。
模型對象代表特別的知識和專業技能,它們負責保有應用程序的數據和定義操作數據的邏輯。
視圖對象知道如何顯示應用程序的模型數據,而且可能允許用戶對其進行編輯。
控制器對象是應用程序的視圖對象和模型對象之間的協調者。
16. 線程與進程的區別和聯系?
進程和線程都是由操作系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對應用的并發性。
進程和線程的主要差別在于它們是不同的操作系統資源管理方式。進程有獨立的地址空間,一個進程崩潰后,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不同執行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等于整個進程死掉,所以多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。但對于一些要求同時進行并且又要共享某些變量的并發操作,只能用線程,不能用進程。
17.列舉幾種進程的同步機制,并比較其優缺點。
答案:原子操作;信號量機制;自旋鎖;管程;會合;分布式系統 ?
18.進程之間通信的途徑
答案:共享存儲系統消息傳遞系統管道,以文件系統為基礎 ?
19.進程死鎖的原因
答案:資源競爭及進程推進順序非法 ?
20.死鎖的4個必要條件
答案:互斥;請求保持;不可剝奪;環路 ?
21.死鎖的處理
答案:鴕鳥策略;預防策略;避免策略;檢測與解除死鎖
22.堆和棧的區別
管理方式:對于棧來講,是由編譯器自動管理,無需我們手工控制;對于堆來說,釋放工作由程序員控制,容易產生memory leak。
申請大小: 棧:在Windows下,棧是向低地址擴展的數據結構,是一塊連續的內存的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就確定的常數),如果申請的空間超過棧的剩余空間時,將提示 overflow。因此,能從棧獲得的空間較小。?堆:堆是向高地址擴展的數據結構,是不連續的內存區域。這是由于系統是用鏈表來存儲的空閑內存地址的,自然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限于計算機系統中有效的虛擬內存。由此可見,堆獲得的空間比較靈活,也比較大。
碎片問題:對于堆來講,頻繁的new/delete勢必會造成內存空間的不連續,從而造成大量的碎片,使程序效率降低。對于棧來講,則不會存在這個問題,因為棧是先進后出的隊列,他們是如此的一一對應,以至于永遠都不可能有一個內存塊從棧中間彈出。
分配方式:堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式:靜態分配和動態分配。靜態分配是編譯器完成的,比如局部變量的分配。動態分配由 alloca函數進行分配,但是棧的動態分配和堆是不同的,他的動態分配是由編譯器進行釋放,無需我們手工實現。
分配效率:棧是機器系統提 供的數據結構,計算機會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。堆則是C/C 函數庫提供的,它的機制是很復雜的。
23.什么是鍵-值,鍵路徑是什么
模型的性質是通過一個簡單的鍵(通常是個字符串)來指定的。視圖和控制器通過鍵 來查找相應的屬性值。在一個給定的實體中,同一個屬性的所有值具有相同的數據類型。鍵-值編碼技術用于進行這樣的查找—它是一種間接訪問對象屬性的機制。
鍵路徑是一個由用點作分隔符的鍵組成的字符串,用于指定一個連接在一起的對象性 質序列。第一個鍵的性質是由先前的性質決定的,接下來每個鍵的值也是相對于其前面的性質。鍵路徑使您可以以獨立于模型?實現的方式指定相關對象的性質。通過鍵路徑,您可以指定對象圖中的一個任意深度的路徑,使其指向相關對象的特定屬性。
For example, the key path address.streetwouldget the value of the address property from the receiving
object, and then determine the streetproperty relative to the address object.
24.c和obj-c 如何混用
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文件和cppinclude的文件中不包含obj-c的東西就可以用了,cpp混用obj-c的關鍵是使用接口,而不能直接使用實現代碼,實際上cpp混用的是 obj-c編譯后的o文件,這個東西其實是無差別的,所以可以用。obj-c的編譯器支持cpp.
25.目標-動作機制
目標是動作消息的接收者。一個控件,或者更為常見的是它的單元,以插座變量(參 見"插座變量"部分)的形式保有其動作消息的目標。
動作是控件發送給目標的消息,或者從目標的角度看,它是目標為了響應動作而實現的方法。
程序需要某些機制來進行事件和指令的翻譯。這個機制就是目標-動作機制。
【iPhone軟件開發面試題(2)】相關文章:
iPhone軟件開發面試題10-23
德國公司經典面試題(2)07-10
軟件開發畢業生實習報告范文(2)07-11
Microsoft面試題09-04
iOS面試題07-10
公司面試題09-12
iphone鎖屏密碼忘了怎么辦07-10
hibernate面試題10-18
英語面試題精選06-13
小升初面試題06-10