ios面試題及答案

1.Difference between shallow copy and deep copy?淺復制和深復制的區別?

答案:淺層復制:只復制指向對象的指針,而不復制引用對象本身。深層復制:復制引用對象本身。意思就是說我有個A對象,復制一份后得到A_copy對象后,對于淺復制來說,A和A_copy指向的是同一個內存資源,復制的只不過是是一個指針,對象本身資源還是只有一份,那如果我們對A_copy執行了修改操作,那么發現A引用的對象同樣被修改,這其實違背了我們復制拷貝的一個思想。深復制就好理解了,內存中存在了兩份獨立對象本身。用網上一哥們通俗的話將就是:淺復制好比你和你的影子,你完蛋,你的影子也完蛋深復制好比你和你的克隆人,你完蛋,你的克隆人還活著。


2.What is advantage of categories? What is difference between implementing a category and inheritance?類別的作用?繼承和類別在實現中有何區別?

答案:category 可以在不獲悉,不改變原來代碼的情況下往里面添加新的方法,只能添加,不能刪除修改。并且如果類別和原來類中的方法產生名稱沖突,則類別將覆蓋原來的方法,因為類別具有更高的優先級。類別主要有3個作用:(1)將類的實現分散到多個不同文件或多個不同框架中。(2)創建對私有方法的前向引用。(3)向對象添加非正式協議。?繼承可以增加,修改或者刪除方法,并且可以增加屬性。

3.Difference between categories and extensions?類別和類擴展的區別。

答案:category和extensions的不同在于 后者可以添加屬性。另外后者添加的方法是必須要實現的。extensions可以認為是一個私有的Category。

4.Difference between protocol in objective c and interfaces in java?obc中的協議和java中的接口概念有何不同?

答案:OBC中的代理有2層含義,官方定義為 formal和informal protocol。前者和Java接口一樣。informal protocol中的方法屬于設計模式考慮范疇,不是必須實現的,但是如果有實現,就會改變類的屬性。其實關于正式協議,類別和非正式協議我很早前學習的時候大致看過,也寫在了學習教程里“非正式協議概念其實就是類別的另一種表達方式“這里有一些你可能希望實現的方法,你可以使用他們更好的完成工作”。這個意思是,這些是可選的。比如我門要一個更好的方法,我們就會申明一個這樣的類別去實現。然后你在后期可以直接使用這些更好的方法。這么看,總覺得類別這玩意兒有點像協議的可選協議。"現在來看,其實protocal已經開始對兩者都統一和規范起來操作,因為資料中說“非正式協議使用interface修飾“,現在我們看到協議中兩個修飾詞:“必須實現(@requied)”和“可選實現(@optional)”。

5.What 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就行了,可以按照kvc查找的邏輯理解,就說的過去了。

6.What is purpose of delegates?代理的作用?

答案:代理的目的是改變或傳遞控制鏈。允許一個類在某些特定時刻通知到其他類,而不需要獲取到那些類的指針。可以減少框架復雜度。另外一點,代理可以理解為java中的回調監聽機制的一種類似。

7.What are mutable and immutable types in Objective C?obc中可修改和不可以修改類型。

答案:可修改不可修改的集合類。這個我個人簡單理解就是可動態添加修改和不可動態添加修改一樣。比如NSArray和NSMutableArray。前者在初始化后的內存空間就是固定不可變的,后者可以添加等,可以動態申請新的內存空間。

8.When we call objective c is runtime language what does it mean?我們說的obc是動態運行時語言是什么意思?

答案:多態。 主要是將數據類型的確定由編譯時,推遲到了運行時。這個問題其實淺涉及到兩個概念,運行時和多態。簡單來說,運行時機制使我們直到運行時才去決定一個對象的類別,以及調用該類別對象指定方法。多態:不同對象以自己的方式響應相同的消息的能力叫做多態。意思就是假設生物類(life)都用有一個相同的方法-eat;那人類屬于生物,豬也屬于生物,都繼承了life后,實現各自的eat,但是調用是我們只需調用各自的eat方法。也就是不同的對象以自己的方式響應了相同的消息(響應了eat這個選擇器)。因此也可以說,運行時機制是多態的基礎?~~~

9.what is difference between NSNotification and protocol?通知和協議的不同之處?

答案:協議有控制鏈(has-a)的關系,通知沒有。首先我一開始也不太明白,什么叫控制鏈(專業術語了~)。但是簡單分析下通知和代理的行為模式,我們大致可以有自己的理解簡單來說,通知的話,它可以一對多,一條消息可以發送給多個消息接受者。代理按我們的理解,到不是直接說不能一對多,比如我們知道的明星經濟代理人,很多時候一個經濟人負責好幾個明星的事務。只是對于不同明星間,代理的事物對象都是不一樣的,一一對應,不可能說明天要處理A明星要一個發布會,代理人發出處理發布會的消息后,別稱B的發布會了。但是通知就不一樣,他只關心發出通知,而不關心多少接收到感興趣要處理。因此控制鏈(has-a從英語單詞大致可以看出,單一擁有和可控制的對應關系。

10.What is push notification?什么是推送消息?

11.Polymorphism?關于多態性

答案:多態,子類指針可以賦值給父類。這個題目其實可以出到一切面向對象語言中,因此關于多態,繼承和封裝基本最好都有個自我意識的理解,也并非一定要把書上資料上寫的能背出來。最重要的是轉化成自我理解。

12.Singleton?對于單例的理解

答案:11,12題目其實出的有點泛泛的感覺了,可能說是編程語言需要或是必備的基礎。基本能用熟悉的語言寫出一個單例,以及可以運用到的場景或是你編程中碰到過運用的此種模式的框架類等。進一步點,考慮下如何在多線程訪問單例時的安全性。

13.What is responder chain?說說響應鏈

答案: 事件響應鏈。包括點擊事件,畫面刷新事件等。在視圖棧內從上至下,或者從下之上傳播。可以說點事件的分發,傳遞以及處理。具體可以去看下touch事件這塊。因為問的太抽象化了嚴重懷疑題目出到越后面就越籠統。

14.Difference between frame and bounds?frame和bounds有什么不同?

答案:frame指的是:該view在父view坐標系統中的位置和大小。(參照點是父親的坐標系統)bounds指的是:該view在本身坐標系統中 的位置和大小。(參照點是本身坐標系統)

15.Difference between method and selector?方法和選擇器有何不同?

答案:selector是一個方法的名字,method是一個組合體,包含了名字和實現.詳情可以看apple文檔。

16.Is there any garbage collection mechanism in Objective C.?OBC的垃圾回收機制?

答案: OBC2.0有Garbage collection,但是iOS平臺不提供。一般我們了解的objective-c對于內存管理都是手動操作的,但是也有自動釋放池。但是差了大部分資料,貌似不要和arc機制搞混就好了。求更多~~

17.NSOperation queue?

答案:存放NSOperation的集合類。操作和操作隊列,基本可以看成java中的線程和線程池的概念。用于處理ios多線程開發的問題。網上部分資料提到一點是,雖然是queue,但是卻并不是帶有隊列的概念,放入的操作并非是按照嚴格的先進現出。這邊又有個疑點是,對于隊列來說,先進先出的概念是Afunc添加進隊列,Bfunc緊跟著也進入隊列,Afunc先執行這個是必然的,但是Bfunc是等Afunc完全操作完以后,B才開始啟動并且執行,因此隊列的概念離亂上有點違背了多線程處理這個概念。但是轉念一想其實可以參考銀行的取票和叫號系統。因此對于A比B先排隊取票但是B率先執行完操作,我們亦然可以感性認為這還是一個隊列。但是后來看到一票關于這操作隊列話題的文章,其中有一句提到“因為兩個操作提交的時間間隔很近,線程池中的線程,誰先啟動是不定的。”瞬間覺得這個queue名字有點忽悠人了,還不如pool~綜合一點,我們知道他可以比較大的用處在于可以幫組多線程編程就好了。

18.What is lazy loading?

答案:懶漢模式,只在用到的時候才去初始化。也可以理解成延時加載。我覺得最好也最簡單的一個列子就是tableView中圖片的加載顯示了。一個延時載,避免內存過高,一個異步加載,避免線程堵塞。

19.Can we use two tableview controllers on one viewcontroller?是否在一個視圖控制器中嵌入兩個tableview控制器?

答案:一個視圖控制只提供了一個View視圖,理論上一個tableViewController也不能放吧,只能說可以嵌入一個tableview視圖。當然,題目本身也有歧義,如果不是我們定性思維認為的UIViewController,而是宏觀的表示視圖控制者,那我們倒是可以把其看成一個視圖控制者,它可以控制多個視圖控制器,比如TabbarController那樣的感覺。

20.Can we use one tableview with two different datasources? How you will achieve this?一個tableView是否可以關聯兩個不同的數據源?你會怎么處理?

答案:首先我們從代碼來看,數據源如何關聯上的,其實是在數據源關聯的代理方法里實現的。因此我們并不關心如何去關聯他,他怎么關聯上,方法只是讓我返回根據自己的需要去設置如相關的數據源。因此,我覺得可以設置多個數據源啊,但是有個問題是,你這是想干嘛呢?想讓列表如何顯示,不同的數據源分區塊顯示?


21.Object-c的類可以多重繼承么?可以實現多個接口么?重寫一個類的方式用繼承好還是分類好?為什么?

Objective-c只支持單繼承,如果要實現多繼承的話,可以通過類別和協議的方式來實現,cocoa 中所有的類都是NSObject 的子類,多繼承在這里是用protocol 委托代理 來實現的。

22.#import 跟#include 又什么區別 #import<> 跟 #import""又什么區別?

答案:@class一般用于頭文件中需要聲明該類的某個實例變量的時候用到,在m文 件中還是需要使用#import而#import比起#include的好處就是不會引起交叉編譯。

以下沒標準答案

23.類變量的@protected ,@private,@public,@package聲明各有什么含義?()

24.id 聲明的對象有什么特性?

答案:id是個很重要的類型,是個可以指向任何類型的指針或者可以理解為指向任何未知類型的指針。

25.MVC是什么?有什么特性?為什么在iPhone上被廣泛運用?

答案:MVC設計模式考慮三種對象:模型對象、視圖對象、和控制器對象。模型對象代表 特別的知識和專業技能,它們負責保有應用程序的數據和定義操作數據的邏輯。視圖對象知道如何顯示應用程序的模型數據,而且可能允許用戶對其進行編輯。控制 器對象是應用程序的視圖對象和模型對象之間的協調者。

26.對于語句NSString* testObject = [[NSData alloc] init];testObject 在編譯時和運行時分別是什么類型的對象?

27.什么是安全釋放?

28.為什么有些4.0獨有的objective-c 函數在3.1上運行時會報錯.而4.0獨有的類在3.1上分配內存時不會報錯?分配的結果是什么?

29.為什么4.0獨有的c函數在3.1的機器上運行不會報錯(在沒有調用的情況下?)而4.0獨有的類名在3.1的機器上一運行就報錯?

30.異常exception 怎么捕獲?不同的CPU結構上開銷怎樣?C中又什么類似的方法?

31.property中屬性retain,copy,assgin的含義分別是什么?有什么區別?將其轉換成get/set方法怎么做?有什么注意事項?

32.委托是什么?委托的property聲明用什么屬性?為什么?

33.淺拷貝和深拷貝區別是什么?...

34.Cocoa中有虛基類的概念么?怎么簡潔的實現?

35.自動釋放池跟GC(垃圾回收)有什么區別?iPhone上有GC么?[pool release] 和[pool drain]有什么區別?

iPhone上沒有GC。iPhone開發的時候沒有垃圾回收機制。

在垃圾回收環境中,release是一個空操作。因此,NSAutoreleasePool提供了drain方法,在引用計數環境中,該方法的作用等同于調用release,但在垃圾回收環境中,它會觸發垃圾回收(如果自上次垃圾回收以來分配的內存大于當前的閾值)。因此,在通常情況下,您應該使用drain而不是release來銷毀自動釋放池。

36.

for(int index = 0; index < 20; index ++){

NSString *tempStr = @”tempStr”;

NSLog(tempStr);

NSNumber *tempNumber = [NSNumber numberWithInt:2];

NSLog(tempNumber);

}

這段代碼有什么問題.?會不會造成內存泄露(多線程)?在內存緊張的設備上做大循環時自動釋放池是寫在循環內好還是循環外好?為什么?

37.內存管理的幾條原則時什么?按照默認法則.那些關鍵字生成的對象需要手動釋放?在和property結合的時候怎樣有效的避免內存泄露?

38.在一個對象釋放前.如果他被加到了notificationCenter 中.不在notificationcenter中remove這個對象可能會出現什么問題?

39.怎樣實現一個 singleton的類.給出思路。

40.什么是序列化或者Acrchiving,可以用來做什么,怎樣與copy結合,原理是什么?.

41. 線程與進程的區別和聯系?

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

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

42.在iphone上有兩件事情要做,請問是在一個線程里按順序做效率高還是兩個線程里做效率高?為什么?

43.runloop是什么?在主線程中的某個函數里調用了異步函數,怎么樣block當前線程,且還能響應當前線程的timer事件,touch事件等.

44.ios平臺怎么做數據的持久化?coredata和sqlite有無必然聯系?coredata是一個關系型數據庫嗎?

iOS中可以有四種持久化數據的方式: 屬性列表、對象歸檔、SQLite3和Core Data;core data可以使你以圖形界面的方式快速的定義app的數據模型,同時在你的代碼中容易獲取到它。core data提供了基礎結構去處理常用的功能,例如保存,恢復,撤銷和重做,允許你在app中繼續創建新的任務。在使用core data的時候,你不用安裝額外的數據庫系統,因為core data使用內置的sqlite數據庫。core data將你app的模型層放入到一組定義在內存中的數據對象。core data會追蹤這些對象的改變,同時可以根據需要做相反的改變,例如用戶執行撤銷命令。當core data在對你app數據的改變進行保存的時候,core data會把這些數據歸檔,并永久性保存。

mac os x中sqlite庫,它是一個輕量級功能強大的關系數據引擎,也很容易嵌入到應用程序。可以在多個平臺使用,sqlite是一個輕量級的嵌入式sql數據庫編程。與core data框架不同的是,sqlite是使用程序式的,sql的主要的API來直接操作數據表。

Core Data不是一個關系型數據庫,也不是關系型數據庫管理系統(RDBMS)。雖然Core Dta支持SQLite作為一種存儲類型,但它不能使用任意的SQLite數據庫。Core Data在使用的過程種自己創建這個數據庫。Core Data支持對一對多的關系。

45.闡述一個nil對象從interface bulider產生,到載入程序運行空間,最后被釋放時所經歷的生命周期.

46.notification是同步還是異步? kvo是同步還是異步?notification是全進程空間的通知嗎?kvo呢?

47.kvc是什么?kvo是什么?有什么特性?

48.響應者鏈是什么?

49.unix上進程怎么通信?

UNIX主要支持三種通信方式:

1. 基本通信:主要用來協調進程間的同步和互斥

(1)鎖文件通信

通信的雙方通過查找特定目錄下特定類型的文件(稱鎖文件)來完成進程間? 對臨界資源訪問時的互斥;例如進程p1訪問一個臨界資源,首先查看是否有一個特定類型文件,若有,則等待一段時間再查找鎖文件。

(2)記錄鎖文件

2. 管道通信:適應大批量的數據傳遞

3. IPC????:適應大批量的數據傳遞

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容