IOS面試題彙總

1、簡答題c++

一、Objective-C的類能夠多重繼承麼?能夠採用多個協議麼?設計模式

不能夠多重繼承,能夠採用多個協議。數組

二、#import和#include的區別是什麼?#import<> 跟 #import""有什麼區別?框架

#import能避免頭文件被重複包含的問題:ide

1.通常來講,導入objective c的頭文件時用#import,包含c/c++頭文件時用#include。函數

使用include要注意重複引用的問題:性能

class A,class B都引用了class C,class D若引用class A與class B,就會報重複引用的錯誤。測試

2. #import肯定一個文件只能被導入一次,這使你在遞歸包含中不會出現問題。編碼

因此,#import比起#include的好處就是它避免了重複引用的問題。因此在OC中咱們基本用的都是import。spa

#import<> 包含iOS框架類庫裏的類,#import""包含項目裏自定義的類。

三、Category是什麼?擴展一個類的方式用繼承好仍是類目好?爲何?

Category是類目。用類目好,由於繼承要知足a is a b的關係,而類目只須要知足a has a b的關係,侷限性更小,你不用定義子類就能擴展一個類的功能,還能將類的定義分開放在不一樣的源文件裏,用Category去重寫類的方法,僅對本Category有效,不會影響到其餘類與原有類的關係。

四、延展是什麼?做用是什麼?

延展(extension):在本身類的實現文件中添加類目來聲明私有方法。

五、類實例(成員)變量的@protected ,@private,@public聲明各有什麼含義?

@protected:受保護的,該實例變量只能在該類和其子類內訪問,其餘類內不能訪問。

@private:私有的,該實例變量只能在該類內訪問,其餘類內不能訪問。

@public:共有的,該實例變量誰均可以訪問。

六、id聲明的對象有什麼特性?

Ø沒有 * 號

Ø動態數據類型

Ø能夠指向任何類的對象(設置是nil),而不關心其具體類型

Ø在運行時檢查其具體類型

Ø能夠對其發送任何(存在的)消息

七、委託是什麼?委託和委託方雙方的property聲明用什麼屬性?爲何?

委託:一個對象保存另一個對象的引用,被引用的對象實現了事先肯定的協議,該協議用於將引用對象中的變化通知給被引用對象。

委託和委託方雙方的property聲明屬性都是assign而不是retain

爲了不循環引用形成的內存泄露。

循環引用的問題這樣理解:

好比在main函數中建立了兩個類的對象A和B,如今引用計數都是1。如今讓A和B互相引用(A有一個屬性是B對象,屬性說明是retain;B有一個屬性是A對象,屬性說明是retain),如今兩個對象的引用計數都增長了1,都變成了2。

如今執行[A release]; [B release]; 此時建立對象的main函數已經釋放了本身對對象的全部權,可是此時A和B的引用計數都仍是1,由於他們互相引用了。

這時你發現A和B將沒法釋放,由於要想釋放A必須先釋放B,在B的dealloc方法中再釋放A。同理,要想釋放B必須先釋放A,在A的dealloc方法中再釋放B。因此這兩個對象將一直存在在內存中而不釋放。這就是所謂的循環引用的問題。

要想解決這個問題,通常的方法能夠將引用的屬性設置爲assign,而不是retain來處理。

八、淺拷貝和深拷貝區別是什麼?

淺層複製:只複製指向對象的指針,而不復制引用對象自己。

深層複製:複製引用對象自己。

意思就是說我有個A對象,複製一份後獲得A_copy對象後,對於淺複製來講,A和A_copy指向的是同一個內存資源,複製的只不過是是一個指針,對象自己資源仍是隻有一份,那若是咱們對A_copy執行了修改操做,那麼發現A引用的對象一樣被修改,這其實違背了咱們複製拷貝的一個思想。深複製就好理解了,內存中存在了兩份獨立對象自己。

用網上一哥們通俗的話將就是:

淺複製比如你和你的影子,你完蛋,你的影子也完蛋

深複製比如你和你的克隆人,你完蛋,你的克隆人還活着。

九、內存管理的幾條原則是什麼?按照默認法則,哪些關鍵字生成的對象須要手動釋放?哪些狀況下不須要手動釋放,會直接進入自動釋放池?

當使用new、alloc或copy方法建立一個對象時,該對象引用計數器爲1。若是不須要使用該對象,能夠向其發送release或autorelease消息,在其使用完畢時被銷燬。

若是經過其餘方法獲取一個對象,則能夠假設這個對象引用計數爲1,而且被設置爲autorelease,不須要對該對象進行清理,若是確實須要retain這個對象,則須要使用完畢後release。

若是retain了某個對象,須要release或autorelease該對象,保持retain方法和release方法使用次數相等。

使用new、alloc、copy關鍵字生成的對象和retain了的對象須要手動釋放。設置爲autorelease的對象不須要手動釋放,會直接進入自動釋放池。

十、怎樣實現一個單例模式的類,給出思路,不寫代碼。

首先必須建立一個全局實例,一般存放在一個全局變量中,此全局變量設置爲nil

提供工廠方法對該全局實例進行訪問,檢查該變量是否爲nil,若是nil就建立一個新的實例,最後返回全局實例

全局變量的初始化在第一次調用工廠方法時會在+allocWithZone:中進行,因此須要重寫該方法,防止經過標準的alloc方式建立新的實例

爲了防止經過copy方法獲得新的實例,須要實現-copyWithZone方法

只需在此方法中返回自己對象便可,引用計數也不須要進行改變,由於單例模式下的對象是不容許銷燬的,因此也就不用保留

由於全局實例不容許釋放,因此retain,release,autorelease方法均需重寫

十一、@class的做用是什麼?

在頭文件中, 通常只須要知道被引用的類的名稱就能夠了。 不須要知道其內部的實體變量和方法,因此在頭文件中通常使用@class來聲明這個名稱是類的名稱。 而在實現類裏面,由於會用到這個引用類的內部的實體變量和方法,因此須要使用#import來包含這個被引用類的頭文件。

@class的做用是告訴編譯器,有這麼一個類,用吧,沒有問題

@class還能夠解決循環依賴的問題,例如A.h導入了B.h,而B.h導入了A.h,每個頭文件的編譯都要讓對象先編譯成功才行

使用@class就能夠避免這種狀況的發生

十二、KVC是什麼?KVO是什麼?有什麼特色?

KVC是鍵值編碼,特色是經過指定表示要訪問的屬性名字的字符串標識符,能夠進行類的屬性讀取和設置

KVO是鍵值觀察,特色是利用鍵值觀察能夠註冊成爲一個對象的觀察者,在該對象的某個屬性變化時收到通知

1三、MVC是什麼?有什麼特性?

MVC是一種設計模式,由模型、視圖、控制器3部分組成。

模型:保存應用程序數據的類,處理業務邏輯的類

視圖:窗口,控件和其餘用戶能看到的而且能交互的元素

控制器:將模型和試圖綁定在一塊兒,肯定如何處理用戶輸入的類

1四、定義屬性時,什麼狀況使用copy、assign、retain?

使用assign:對基礎數據類型(NSInteger,CGFloat)和C數據類型(int, float, double, char,等等)

使用copy:但願得到源對象的副本而不改變源對象內容時,對NSString

使用retain:但願得到源對象的全部權時,對其餘NSObject和其子類


5.對於語句NSString*obj = [[NSData alloc] init]; obj在編譯時和運行時分別時什麼類型的對象?

編譯時是NSString的類型;運行時是NSData類型的對象

6.常見的object-c的數據類型有那些, 和C的基本數據類型有什麼區別?如:NSInteger和int

object-c的數據類型有NSString,NSNumber,NSArray,NSMutableArray,NSData等等,這些都是class,建立後即是對象,而C語言的基本數據類型int,只是必定字節的內存空間,用於存放數值;而object-c的NSNumber包含有父類NSObject的方法和NSNumber本身的方法,能夠完成複雜的操做。


7.id 聲明的對象有什麼特性?

Id 聲明的對象具備運行時的特性,便可以指向任意類型的objcetive-c的對象;


8.Objective-C如何對內存管理的,說說你的見解和解決方法?

Objective-C的內存管理主要有三種方式ARC(自動內存計數)、手動內存計數、內存池。


9.內存管理的幾條原則時什麼?按照默認法則.那些關鍵字生成的對象

須要手動釋放?在和property結合的時候怎樣有效的避免內存泄露?

誰申請,誰釋放

遵循Cocoa Touch的使用原則;

內存管理主要要避免「過早釋放」和「內存泄漏」,對於「過早釋放」須要注意@property設置特性時,必定要用對特性關鍵字,對於「內存泄漏」,必定要申請了要負責釋放,要細心。

關鍵字alloc 或new 生成的對象須要手動釋放;

設置正確的property屬性,對於retain須要在合適的地方釋放,


10.如何對iOS設備進行性能測試?

Profile-> Instruments ->Time Profiler

11.看下面的程序,第一個NSLog會輸出什麼?這時str的retainCount是多少?第二個和第三個呢? 爲何?


  1. =======================================================  

  2. NSMutableArray* ary = [[NSMutableArray array] retain];  

  3. NSString *str = [NSString stringWithFormat:@"test"];  

  4. [strretain];  

  5. [aryaddObject:str];  

  6. NSLog(@"%@%d",str,[str retainCount]);  

  7. [strretain];  

  8. [strrelease];  

  9. [strrelease];  

  10. NSLog(@"%@%d",str,[str retainCount]);  

  11. [aryremoveAllObjects];  

  12. NSLog(@"%@%d",str,[str retainCount]);  

  13. =======================================================  


str的retainCount建立+1,retain+1,加入數組自動+1

3

retain+1,release-1,release-1

2

數組刪除全部對象,全部數組內的對象自動-1

1

12. Object C中建立線程的方法是什麼?若是在主線程中執行代碼,方法是什麼?若是想延時執行代碼、方法又是什麼?

線程建立有三種方法:使用NSThread建立、使用GCD的dispatch、使用子類化的NSOperation,而後將其加入NSOperationQueue;在主線程執行代碼,方法是performSelectorOnMainThread,若是想延時執行代碼能夠用performSelector:onThread:withObject:waitUntilDone:

13.描述一下iOS SDK中如何實現MVC的開發模式

MVC是模型、試圖、控制開發模式,對於iOS SDK,全部的View都是視圖層的,它應該獨立於模型層,由視圖控制層來控制。全部的用戶數據都是模型層,它應該獨立於視圖。全部的ViewController都是控制層,由它負責控制視圖,訪問模型數據。



C語言,一個程序佔用的內存分爲哪幾個區 啊
靜態區  常量區 代碼區 堆  棧 
相關文章
相關標籤/搜索