1. 程式人生 > >ios面試題1

ios面試題1

utl 格式 top 執行環境 而是 sna 系統資源 分配內存 workspace

iOS面試題


?

  1. 1.寫一個NSString類的實現

+?(id)initWithCString:(c*****t char *)nullTerminatedCString encoding:(NSStringEncoding)encoding;?

+ (id) stringWithCString: (c*****t char*)nullTerminatedCString??

??????????? encoding: (NSStringEncoding)encoding?

{?

? NSString? *obj;?

? obj = [self allocWithZone: NSDefaultMallocZone()];?

? obj = [obj initWithCString: nullTerminatedCString encoding: encoding];?

? return AUTORELEASE(obj);?

}?

2static?keyword的作用:?

(1)函數體內?static?變量的作用範圍為該函數體。不同於?auto?變量。該變量的內存僅僅被分配一次,?

因此其值在下次調用時仍維持上次的值;?

(2)在模塊內的?static?全局變量能夠被模塊內所用函數訪問,但不能被模塊外其他函數訪問;?

(3)在模塊內的?static?函數僅僅可被這一模塊內的其他函數調用,這個函數的使用範圍被限制在聲明?

它的模塊內。?

(4)在類中的?static?成員變量屬於整個類所擁有,對類的全部對象僅僅有一份拷貝。?

(5)在類中的?static?成員函數屬於整個類所擁有。這個函數不接收?this?指針。因而僅僅能訪問類的static?成員變量。??

3線程與進程的差別和聯系??

進程和線程都是由操作系統所體會的程序執行的基本單元,系統利用該基本單元實現系統對應用的並發性。?

程和線程的主要差別在於它們是不同的操作系統資源管理方式。進程有獨立的地址空間,一個進程崩潰後。在保護模式下不會對其他進程產生影響,而線程僅僅是一個進程中的不同執行路徑。線程有自己的堆棧和局部變量。但線程之間沒有單獨的地址空間,一個線程死掉就等於整個進程死掉,所以多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。但對於一些要求同一時候進行而且又要共享某些變量的並發操作,僅僅能用線程,不能用進程。

4堆和棧的差別?

管理方式:對於棧來講,是由編譯器自己主動管理,無需我們手工控制;對於堆來說。釋放工作由程序猿控制。easy產生memory leak。

?

申請大小:?

棧:在Windows下,棧是向低地址擴展的數據結構,是一塊連續的內存的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在?WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就確定的常數),假設申請的空間超過棧的剩余空間時,將提示overflow。因此,能從棧獲得的空間較小。?

堆:堆是向高地址擴展的數據結構,是不連續的內存區域。

這是由於系統是用鏈表來存儲的空暇內存地址的,自然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限於計算機系統中有效的虛擬內存。

由此可見。堆獲得的空間比較靈活,也比較大。?

碎片問題:對於堆來講,頻繁的new/delete勢必會造成內存空間的不連續。從而造成大量的碎片,使程序效率降低。對於棧來講,則不會存在這個問題。由於棧是先進後出的隊列,他們是如此的一一對應。以至於永遠都不可能有一個內存塊從棧中間彈出?

分配方式:堆都是動態分配的。沒有靜態分配的堆。棧有2種分配方式:靜態分配和動態分配。靜態分配是編譯器完畢的,比方局部變量的分配。動態分配由alloca函數進行分配,可是棧的動態分配和堆是不同的。他的動態分配是由編譯器進行釋放,無需我們手工實現。?

分配效率:棧是機器系統提供的數據結構。計算機會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。堆則是C/C++函數庫提供的。它的機制是非常復雜的。

5什麽是鍵-,鍵路徑是什麽?

模型的性質是通過一個簡單的鍵(一般是個字符串)來指定的。視圖和控制器通過鍵來查找對應的屬性值。在一個給定的實體中。同一個屬性的全部值具有同樣的數據類型。

鍵-值編碼技術用於進行這種查找—它是一種間接訪問對象屬性的機制。?

鍵路徑是一個由用點作分隔符的鍵組成的字符串,用於指定一個連接在一起的對象性質序列。第一個鍵的?

性質是由先前的性質決定的,接下來每一個鍵的值也是相對於其前面的性質。鍵路徑使您能夠以獨立於模型?

實現的方式指定相關對象的性質。通過鍵路徑,您能夠指定對象圖中的一個隨意深度的路徑,使其指向相?

關對象的特定屬性。

?

6目標-動作機制?

?

目標是動作消息的接收者。一個控件。或者更為常見的是它的單元,以插座變量(參見"插座變量"部分)?

的形式保有其動作消息的目標。

?

動作是控件發送給目標的消息,或者從目標的角度看,它是目標為了響應動作而實現的方法。?

程序須要某些機制來進行事件和指令的翻譯。這個機制就是目標-動作機制。?

7objc的內存管理?

?

?

??假設您通過分配和初始化(比方[[MyClass alloc] init])的方式來創建對象。您就擁?

有這個對象,須要負責該對象的釋放。

這個規則在使用NSObject的便利方法new?時也同樣適用。?

?

???假設您拷貝一個對象。您也擁有拷貝得到的對象,須要負責該對象的釋放。

?

????假設您保持一個對象,您就部分擁有這個對象,須要在不再使用時釋放該對象。

?

反過來。?

????假設您從其他對象那裏接收到一個對象。則您不擁有該對象。也不應該釋放它(這個規則有少數?

的例外,在參考文檔中有顯式的說明)。


技術分享圖片

?

8?自己主動釋放池是什麽,怎樣工作?

當您向一個對象發送一個autorelease消息時。Cocoa就會將該對象的一個引用放入到最新的自己主動釋放池。

它仍然是個正當的對象,因此自己主動釋放池定義的作用域內的其他對象能夠向它發送消息。當程序執行到作用域結束的位置時。自己主動釋放池就會被釋放,池中的全部對象也就被釋放。?

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

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

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

9類工廠方法是什麽?

類工廠方法的實現是為了向客戶提供方便,它們將分配和初始化合在一個步驟中,返回被創建的對象,並?

進行自己主動釋放處理。

這些方法的形式是+ (type)className...(當中?className不包含不論什麽前綴)。?

工廠方法可能不僅僅為了方便使用。它們不但能夠將分配和初始化合在一起。還能夠為初始化過程提供對?

象的分配信息。?

類工廠方法的還有一個目的是使類(比方NSWorkspace)提供單件實例。雖然init...方法能夠確認一?

個類在每次程序執行過程僅僅存在一個實例,但它須要首先分配一個“生的”實例,然後還必須釋放該實例。?

工廠方法則能夠避免為可能沒實用的對象盲目分配內存。

?

10單件實例是什麽?

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

假設類在概念上僅僅有一個實例(比方?

NSWorkspace),就應該產生一個單件實例,而不是多個實例。假設將來某一天可能有多個實例,您可?

以使用單件實例機制,而不是工廠方法或函數。

11動態綁定?

—在執行時確定要調用的方法?

?

動態綁定將調用方法的確定也推遲到執行時。在編譯時,方法的調用並不和代碼綁定在一起,僅僅有在消實發送出來之後,才確定被調用的代碼。通過動態類型和動態綁定技術。您的代碼每次執行都能夠得到不同的結果。執行時因子負責確定消息的接收者和被調用的方法。

執行時的消息分發機制為動態綁定提供支持。

當您向一個動態類型確定了的對象發送消息時。執行環境系統會通過接收者的isa指針定位對象的類。並以此為起點確定被調用的方法,方法和消息是動態綁定的。而且。您不必在Objective-C?代碼中做不論什麽工作,就能夠自己主動獲取動態綁定的優點。您在每次發送消息時,?

?

特別是當消息的接收者是動態類型已經確定的對象時。動態綁定就會例行而透明地發生。

12obj-c的優缺點?

objc優點:?

??1) Cateogies?

??2) Posing?

??3)?動態識別?

??4)?指標計算?

??5)彈性訊息傳遞?

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

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

缺點:?

? 1)?不支援命名空間?

? 2)??不支持運算符重載?

? 3)不支持多重繼承?

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

13sprintf,strcpy,memcpy使用上有什麽要註意的地方?

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

將?src開始的一段字符串復制到dst開始的內存中去,結束的標誌符號為‘\0‘,由於拷貝的長度不是由我們自己控制的,所以這個字符串拷貝非常easy出錯。

具備字符串拷貝功能的函數有memcpy,這是一個內存拷貝函數。它的函數原型為memcpy(char *dst, c*****t char* src, unsigned int len);?

將長度為len的一段內存,從src復制到dst中去,這個函數的長度可控。可是會有內存疊加的問題。?

sprintf是格式化函數。

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

14答案是:???

a) int a; // An integer???

b) int *a; // A pointer to an integer???

c) int **a; // A pointer to a pointer to an integer???

d) int a[10]; // An array of 10 integers???

e) int *a[10]; // An array of 10 pointers to integers???

f) int (*a)[10]; // A pointer to an array of 10 integers???

g) int (*a)(int); // A pointer to a function a that? takes an integer argument and returns an integer???

h) int (*a[10])(int); // An array of 10 pointers to functi*****? that take an integer argument and return an integer?

15.readwritereadonlyassignretaincopynonatomic屬性的作用?

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

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

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

2,assign。setter方法直接賦值,不進行不論什麽retain操作,為了解決原類型與環循引用問題?

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

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

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

a和b各自有自己的內存。

5,nonatomic。非原子性訪問,不加同步,多線程並發訪問會提高性能。註意,假設不加此屬性,則默認是兩個訪問方法都為原子型事務訪問。鎖被加到所屬對象實例級(我是這麽理解的...)。

atomic和nonatomic用來決定編譯器生成的getter和setter是否為原子操作。

在多線程環境下,原子操作是必要的,否則有可能引起錯 誤的結果。加了atomic。setter函數會變成以下這樣:

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

17什麽是KVC和KVO?答:KVC(Key-Value-Coding)內部的實現:一個對象在調用setValue的時候。(1)首先依據方法名找到執行方法的時候所須要的環境參數。

(2)他會從自己isa指針結合環境參數。找到詳細的方法實現的接口。(3)再直接查找得來的詳細的方法實現。KVO(Key-Value- Observing):當觀察者為一個對象的屬性進行了註冊,被觀察對象的isa指針被改動的時候。isa指針就會指向一個中間類,而不是真實的類。所以?isa指針事實上不須要指向實例對象真實的類。

所以我們的程序最好不要依賴於isa指針。在調用類的方法的時候,最好要明白對象實例的類名

18ViewController?的?loadView, viewDidLoad, viewDidUnload?各自是在什麽時候調用的?在自己定義ViewController的時候這幾個函數裏面應該做什麽工作?答:viewDidLoad在view?從nib文件初始化時調用。loadView在controller的view為nil時調用。

此方法在編程實現view時調用,view?控制器默認會註冊memory warning notification,當view controller的不論什麽view?沒實用的時候,viewDidUnload會被調用,在這裏實現將retain?的view release,假設是retain的IBOutlet view?屬性則不要在這裏release,IBOutlet會負責release?。

19

"NSMutableString *"這個數據類型則是代表"NSMutableString"對象本身。這兩者是有差別的。

而NSString僅僅是對象的指針而已。

面向過程就是分析出解決這個問題所須要的步驟,然後用函數把這些步驟一步一步實現,使用的時候一個一個依次調用就能夠了。?

面向對象是把構成問題事務分解成各個對象。建立對象的目的不是為了完畢一個步驟,而是為了描敘某個事物在整個解決這個問題的步驟中的行為。。

20類別的作用

類別主要有3個作用:

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

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

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

類別的局限性

有雙方面局限性:

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

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

無法加入實例變量的局限能夠使用字典對象解決

21keywordvolatile有什麽含意?並給出三個不同的樣例:

一個定義為volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設這個變量的值了。精確地說就是,優化器在用到

這個變量時必須每次都小心地又一次讀取這個變量的值,而不是使用保存在寄存器裏的備份。以下是volatile變量的幾個樣例:

??並行設備的硬件寄存器(如:狀態寄存器)

??一個中斷服務子程序中會訪問到的非自己主動變量(Non-automatic variables)

??多線程應用中被幾個任務共享的變量

?

??一個參數既能夠是const還能夠是volatile嗎?解釋為什麽。

??一個指針能夠是volatile?嗎?解釋為什麽。

技術分享圖片?



以下是答案:

??是的。一個樣例是僅僅讀的狀態寄存器。

它是volatile由於它可能被意想不到地改變。它是const由於程序不應該試圖去改動它。

??是的。雖然這並不非經常見。一個樣例是當一個中服務子程序修該一個指向一個buffer的指針時。

22@synthesize?是系統自己主動生成getter和setter屬性聲明

@dynamic?是開發者自已提供對應的屬性聲明

@dynamic?意思是由開發者提供對應的代碼:對於僅僅讀屬性須要提供?setter,對於讀寫屬性須要提供?setter?和getter。@synthesize?意思是,除非開發者已經做了,否則由編譯器生成對應的代碼,以滿足屬性聲明。

?查閱了一些資料確定@dynamic的意思是告訴編譯器,屬性的獲取與賦值方法由用戶自己實現,?不自己主動生成。

23Difference between shallow copy and deep copy?
淺復制和深復制的差別?
答案:淺層復制:僅僅復制指向對象的指針。而不復制引用對象本身。
深層復制:復制引用對象本身。
意思就是說我有個A對象,復制一份後得到A_copy對象後,對於淺復制來說,A和A_copy指向的是同一個內存資源,復制的僅僅只是是是一個指針,對象本身資源
還是僅僅有一份,那假設我們對A_copy執行了改動操作,那麽發現A引用的對象同樣被改動,這事實上違背了我們復制拷貝的一個思想。深復制就好理解了,內存中存在了
兩份獨立對象本身。
用網上一哥們通俗的話將就是:
淺復制好比你和你的影子,你完蛋,你的影子也完蛋
深復制好比你和你的克隆人,你完蛋,你的克隆人還活著。

24What is advantage of categories?

What is difference between implementing a category and inheritance?


類別的作用?繼承和類別在實現中有何差別?
答案:category?能夠在不獲悉,不改變原來代碼的情況下往裏面加入新的方法。僅僅能加入,不能刪除改動。


而且假設類別和原來類中的方法產生名稱沖突。則類別將覆蓋原來的方法,由於類別具有更高的優先級。


類別主要有3個作用:
(1)將類的實現分散到多個不同文件或多個不同框架中。
(2)創建對私有方法的前向引用。
(3)向對象加入非正式協議。
?繼承能夠添加,改動或者刪除方法。而且能夠添加屬性。

25.Difference between categories and extensions?
類別和類擴展的差別。


?答案:category和extensions的不同在於?後者能夠加入屬性。另外後者加入的方法是必須要實現的。


extensions能夠覺得是一個私有的Category。

26.Difference between protocol in objective c and interfaces in java?


oc中的協議和java中的接口概念有何不同?
答案:OC中的代理有2層含義,官方定義為?formal和informal protocol。前者和Java接口一樣。
informal protocol中的方法屬於設計模式考慮範疇,不是必須實現的。可是假設有實現。就會改變類的屬性。


事實上關於正式協議,類別和非正式協議我非常早前學習的時候大致看過,也寫在了學習教程裏
“非正式協議概念事實上就是類別的還有一種表達方式“這裏有一些你可能希望實現的方法,你能夠使用他們更好的完畢工作”。
這個意思是。這些是可選的。比方我門要一個更好的方法,我們就會申明一個這種類別去實現。

然後你在後期能夠直接使用這些更好的方法。
這麽看,總覺得類別這玩意兒有點像協議的可選協議。"
如今來看。事實上protocal已經開始對兩者都統一和規範起來操作,由於資料中說“非正式協議使用interface修飾“,
如今我們看到協議中兩個修飾詞:“必須實現(@requied)”和“可選實現(@optional)”。

26What are KVO and KVC?


答案:kvc:鍵?-?值編碼是一種間接訪問對象的屬性使用字符串來標識屬性,而不是通過調用存取方法,直接或通過實例變量訪問的機制。
非常多情況下能夠簡化程序代碼。apple文檔事實上給了一個非常好的樣例。
kvo:鍵值觀察機制,他提供了觀察某一屬性變化的方法,極大的簡化了代碼。


詳細用看到嗯哼用到過的一個地方是對於按鈕點擊變化狀態的的監控。
比方我自己定義的一個button
[cpp]?
[self addObserver:self forKeyPath:@"highlighted" options:0 context:nil];?
#pragma mark KVO?
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context?
{?
??? if ([keyPath isEqualToString:@"highlighted"] ) {?
??????? [self setNeedsDisplay];?
??? }?
}?

對於系統是依據keypath去取的到對應的值發生改變。理論上來說是和kvc機制的道理是一樣的。
對於kvc機制怎樣通過key尋找到value:
“當通過KVC調用對象時,比方:[self valueForKey:@”someKey”]時。程序會自己主動試圖通過幾種不同的方式解析這個調用。首先查找對象是否帶有?someKey?這種方法,假設沒找到,會繼續查找對象是否帶有someKey這個實例變量(iVar)。假設還沒有找到,程序會繼續試圖調用?-(id) valueForUndefinedKey:這種方法。

假設這種方法還是沒有被實現的話,程序會拋出一個NSUndefinedKeyException異常錯誤。
(cocoachina.com註:Key-Value Coding查找方法的時候,不僅僅會查找someKey這種方法,還會查找getsomeKey這種方法,前面加一個get。或者_someKey以及_getsomeKey這幾種形式。

同一時候。查找實例變量的時候也會不僅僅查找someKey這個變量,也會查找_someKey這個變量是否存在。


設計valueForUndefinedKey:方法的主要目的是當你使用-(id)valueForKey方法從對象中請求值時,對象能夠在發生錯誤前。有最後的機會響應這個請求。這樣做有非常多優點。以下的兩個樣例說明了這樣做的優點。


來至cocoa,這個說法應該挺有道理。
由於我們知道button卻是存在一個highlighted實例變量.因此為何上面我們僅僅是add一個相關的keypath即可了,

27What is purpose of delegates?
代理的作用?
答案:代理的目的是改變或傳遞控制鏈。

同意一個類在某些特定時刻通知到其他類。而不須要獲取到那些類的指針。能夠降低框架復雜度。
另外一點,代理能夠理解為java中的回調監聽機制的一種相似。

28What are mutable and immutable types in Objective C?
oc中可改動和不能夠改動類型。
答案:可改動不可改動的集合類。

這個我個人簡單理解就是可動態加入改動和不可動態加入改動一樣。
比方NSArray和NSMutableArray。前者在初始化後的內存控件就是固定不可變的,後者能夠加入等,能夠動態申請新的內存空間

29When we call objective c is runtime language what does it mean?


我們說的oc是動態執行時語言是什麽意思?
答案:多態。主要是將數據類型的確定由編譯時。推遲到了執行時。


這個問題事實上淺涉及到兩個概念,執行時和多態。


簡單來說,執行時機制使我們直到執行時才去決定一個對象的類別,以及調用該類別對象指定方法。


多態:不同對象以自己的方式響應同樣的消息的能力叫做多態。意思就是假設生物類(life)都用有一個同樣的方法-eat;
那人類屬於生物,豬也屬於生物,都繼承了life後。實現各自的eat,可是調用是我們僅僅需調用各自的eat方法。
也就是不同的對象以自己的方式響應了同樣的消息(響應了eat這個選擇器)。
因此也能夠說,執行時機制是多態的基礎?~~~

30what is difference between NSNotification and protocol?
通知和協議的不同之處?
答案:協議有控制鏈(has-a)的關系。通知沒有。
首先我一開始也不太明白,什麽叫控制鏈(專業術語了~)。可是簡單分析下通知和代理的行為模式。我們大致能夠有自己的理解
簡單來說,通知的話。它能夠一對多,一條消息能夠發送給多個消息接受者。
代理按我們的理解。到不是直接說不能一對多,比方我們知道的明星經濟代理人,非常多時候一個經濟人負責好幾個明星的事務。


僅僅是對於不同明星間,代理的事物對象都是不一樣的,一一對應,不可能說明天要處理A明星要一個公布會,代理人發出處理公布會的消息後,別稱B的
公布會了。

可是通知就不一樣。他僅僅關心發出通知,而不關心多少接收到感興趣要處理。
因此控制鏈(has-a從英語單詞大致能夠看出。單一擁有和可控制的對應關系。


ios面試題1