IOS 常見面試題


1.Difference between shallow copy and deep copy?

淺復制和深復制的區(qū)別?

淺層復制:只復制指向?qū)ο蟮闹羔?,而不復制引用對象本身?/p>

深層復制:復制引用對象本身。

意思就是說我有個A對象,復制一份后得到A_copy對象后,對于淺復制來說,A和A_copy指向的是同一個內(nèi)存資源,復制的只不過是是一個指針,對象本身資源

還是只有一份,那如果我們對A_copy執(zhí)行了修改操作,那么發(fā)現(xiàn)A引用的對象同樣被修改,這其實違背了我們復制拷貝的一個思想。深復制就好理解了,內(nèi)存中存在了

兩份獨立對象本身。

用網(wǎng)上一哥們通俗的話將就是:

淺復制好比你和你的影子,你完蛋,你的影子也完蛋

深復制好比你和你的克隆人,你完蛋,你的克隆人還活著。

2.What is advantage of categories? What is difference between implementing a category and inheritance?

類別的作用?繼承和類別在實現(xiàn)中有何區(qū)別?

category 可以在不獲悉,不改變原來代碼的情況下往里面添加新的方法,只能添加,不能刪除修改。

并且如果類別和原來類中的方法產(chǎn)生名稱沖突,則類別將覆蓋原來的方法,因為類別具有更高的優(yōu)先級。

類別主要有3個作用:

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

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

(3)向?qū)ο筇砑臃钦絽f(xié)議。

繼承可以增加,修改或者刪除方法,并且可以增加屬性。

3.Difference between categories and extensions?

類別和類擴展的區(qū)別。

category和extensions的不同在于 后者可以添加屬性。另外后者添加的方法是必須要實現(xiàn)的。

extensions可以認為是一個私有的Category。

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

obc中的協(xié)議和java中的接口概念有何不同?

OBC中的代理有2層含義,官方定義為 formal和informal protocol。前者和Java接口一樣。

informal protocol中的方法屬于設計模式考慮范疇,不是必須實現(xiàn)的,但是如果有實現(xiàn),就會改變類的屬性。

其實關于正式協(xié)議,類別和非正式協(xié)議我很早前學習的時候大致看過,也寫在了學習教程里

“非正式協(xié)議概念其實就是類別的另一種表達方式“這里有一些你可能希望實現(xiàn)的方法,你可以使用他們更好的完成工作”。

這個意思是,這些是可選的。比如我門要一個更好的方法,我們就會申明一個這樣的類別去實現(xiàn)。然后你在后期可以直接使用這些更好的方法。

這么看,總覺得類別這玩意兒有點像協(xié)議的可選協(xié)議。"

現(xiàn)在來看,其實protocal已經(jīng)開始對兩者都統(tǒng)一和規(guī)范起來操作,因為資料中說“非正式協(xié)議使用 interface修飾“,

現(xiàn)在我們看到協(xié)議中兩個修飾詞:“必須實現(xiàn)(@requied)”和“可選實現(xiàn)(@optional)”。

5.What are KVO and KVC?

kvc:鍵 - 值編碼是一種間接訪問對象的屬性使用字符串來標識屬性,而不是通過調(diào)用存取方法,直接或通過實例變量訪問的機制。

很多情況下可以簡化程序代碼。 apple文檔其實給了一個很好的例子。

kvo:鍵值觀察機制,他提供了觀察某一屬性變化的方法,極大的簡化了代碼。

具體用看到嗯哼用到過的一個地方是對于按鈕點擊變化狀態(tài)的的監(jiān)控。

比如我自定義的一個button

[self addObserver:self forKeyPath:@"highlighted" options:0context:nil];#pragmamark KVO- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)objectchange:(NSDictionary *)changecontext:(void*)context{if([keyPath isEqualToString:@"highlighted"] ){ [selfsetNeedsDisplay];}}

對于系統(tǒng)是根據(jù)keypath去取的到相應的值發(fā)生改變,理論上來說是和kvc機制的道理是一樣的。

對于kvc機制如何通過key尋找到value:

“當通過KVC調(diào)用對象時,比如:[self valueForKey:@”someKey”]時,程序會自動試圖通過幾種不同的方式解析這個調(diào)用。首先查找對象是否帶有 someKey 這個方法,如果沒找到,會繼續(xù)查找對象是否帶有someKey這個實例變量(iVar),如果還沒有找到,程序會繼續(xù)試圖調(diào)用 -(id) valueForUndefinedKey:這個方法。如果這個方法還是沒有被實現(xiàn)的話,程序會拋出一個

NSUndefinedKeyException 異常錯誤。

(cocoachina.com注:Key-Value Coding查找方法的時候,不僅僅會查找someKey這個方法,還會查找getsomeKey這個方法,前面加一個get,或者_someKey以及 _getsomeKey這幾種形式。同時,查找實例變量的時候也會不僅僅查找someKey這個變量,也會查找_someKey這個變量是否存在。)

設計valueForUndefinedKey:方法的主要目的是當你使用-(id)valueForKey方法從對象中請求值時,對象能夠在錯誤發(fā)生前,有最后的機會響應這個請求。這樣做有很多好處,下面的兩個例子說明了這樣做的好處?!?/p>

來至cocoa,這個說法應該挺有道理。

因為我們知道 button卻是存在一個highlighted實例變量.因此為何上面我們只是add一個相關的keypath就行了,

可以按照kvc查找的邏輯理解,就說的過去了。

6.What is purpose of delegates?

代理的作用?

代理的目的是改變或傳遞控制鏈。允許一個類在某些特定時刻通知到其他類,而不需要獲取到那些類的指針。可以減少框架復雜度。

另外一點,代理可以理解為java中的回調(diào)監(jiān)聽機制的一種類似。

7.What are mutable and immutable types in Objective C?

obc中可修改和不可以修改類型。

可修改不可修改的集合類。這個我個人簡單理解就是可動態(tài)添加修改和不可動態(tài)添加修改一樣。

比如NSArray和NSMutableArray。前者在初始化后的內(nèi)存控件就是固定不可變的,后者可以添加等,可以動態(tài)申請新的內(nèi)存空間。

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

我們說的obc是動態(tài)運行時語言是什么意思?

多態(tài)。 主要是將數(shù)據(jù)類型的確定由編譯時,推遲到了運行時。

這個問題其實淺涉及到兩個概念,運行時和多態(tài)。

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

多態(tài):不同對象以自己的方式響應相同的消息的能力叫做多態(tài)。意思就是假設生物類(life)都用有一個相同的方法-eat;

那人類屬于生物,豬也屬于生物,都繼承了life后,實現(xiàn)各自的eat,但是調(diào)用是我們只需調(diào)用各自的eat方法。

也就是不同的對象以自己的方式響應了相同的消息(響應了eat這個選擇器)。

因此也可以說,運行時機制是多態(tài)的基礎?~~~

9.what is difference between NSNotification and protocol?

通知和協(xié)議的不同之處?

協(xié)議有控制鏈(has-a)的關系,通知沒有。

首先我一開始也不太明白,什么叫控制鏈(專業(yè)術語了~)。但是簡單分析下通知和代理的行為模式,我們大致可以有自己的理解

簡單來說,通知的話,它可以一對多,一條消息可以發(fā)送給多個消息接受者。

代理按我們的理解,到不是直接說不能一對多,比如我們知道的明星經(jīng)濟代理人,很多時候一個經(jīng)濟人負責好幾個明星的事務。

只是對于不同明星間,代理的事物對象都是不一樣的,一一對應,不可能說明天要處理A明星要一個發(fā)布會,代理人發(fā)出處理發(fā)布會的消息后,別稱B的

發(fā)布會了。但是通知就不一樣,他只關心發(fā)出通知,而不關心多少接收到感興趣要處理。

因此控制鏈(has-a從英語單詞大致可以看出,單一擁有和可控制的對應關系。

10.What is push notification?

什么是推送消息?

11.Polymorphism?

關于多態(tài)性

多態(tài),子類指針可以賦值給父類。

這個題目其實可以出到一切面向?qū)ο笳Z言中,

因此關于多態(tài),繼承和封裝基本最好都有個自我意識的理解,也并非一定要把書上資料上寫的能背出來。

最重要的是轉(zhuǎn)化成自我理解。

12.Singleton?

對于單例的理解

11,12題目其實出的有點泛泛的感覺了,可能說是編程語言需要或是必備的基礎。

基本能用熟悉的語言寫出一個單例,以及可以運用到的場景或是你編程中碰到過運用的此種模式的框架類等。

進一步點,考慮下如何在多線程訪問單例時的安全性。

13.What is responder chain?

說說響應鏈

事件響應鏈。包括點擊事件,畫面刷新事件等。在視圖棧內(nèi)從上至下,或者從下之上傳播。

可以說點事件的分發(fā),傳遞以及處理。具體可以去看下touch事件這塊。因為問的太抽象化了

嚴重懷疑題目出到越后面就越籠統(tǒng)。

14.Difference between frame and bounds?

frame和bounds有什么不同?

frame指的是:該view在父view坐標系統(tǒng)中的位置和大小。(參照點是父親的坐標系統(tǒng))

bounds指的是:該view在本身坐標系統(tǒng)中 的位置和大小。(參照點是本身坐標系統(tǒng))

15.Difference between method and selector?

方法和選擇器有何不同?

selector是一個方法的名字,method是一個組合體,包含了名字和實現(xiàn).

詳情可以看apple文檔。

16.Is there any garbage collection mechanism in Objective C.?

OBC的垃圾回收機制?

OBC2.0有Garbage collection,但是iOS平臺不提供。

一般我們了解的objective-c對于內(nèi)存管理都是手動操作的,但是也有自動釋放池。

但是差了大部分資料,貌似不要和arc機制搞混就好了。

17.NSOperation queue?

存放NSOperation的集合類。

操作和操作隊列,基本可以看成java中的線程和線程池的概念。用于處理ios多線程開發(fā)的問題。

網(wǎng)上部分資料提到一點是,雖然是queue,但是卻并不是帶有隊列的概念,放入的操作并非是按照嚴格的先進現(xiàn)出。

這邊又有個疑點是,對于隊列來說,先進先出的概念是Afunc添加進隊列,Bfunc緊跟著也進入隊列,Afunc先執(zhí)行這個是必然的,

但是Bfunc是等Afunc完全操作完以后,B才開始啟動并且執(zhí)行,因此隊列的概念離亂上有點違背了多線程處理這個概念。

但是轉(zhuǎn)念一想其實可以參考銀行的取票和叫號系統(tǒng)。

因此對于A比B先排隊取票但是B率先執(zhí)行完操作,我們亦然可以感性認為這還是一個隊列。

但是后來看到一票關于這操作隊列話題的文章,其中有一句提到

“因為兩個操作提交的時間間隔很近,線程池中的線程,誰先啟動是不定的。”

瞬間覺得這個queue名字有點忽悠人了,還不如pool~

綜合一點,我們知道他可以比較大的用處在于可以幫組多線程編程就好了。

18.What is lazy loading?

懶漢模式,只在用到的時候才去初始化。也可以理解成延時加載。

我覺得最好也最簡單的一個列子就是tableView中圖片的加載顯示了。

一個延時載,避免內(nèi)存過高,一個異步加載,避免線程堵塞。

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是否可以關聯(lián)兩個不同的數(shù)據(jù)源?你會怎么處理?

首先我們從代碼來看,數(shù)據(jù)源如何關聯(lián)上的,其實是在數(shù)據(jù)源關聯(lián)的代理方法里實現(xiàn)的。

因此我們并不關心如何去關聯(lián)他,他怎么關聯(lián)上,方法只是讓我返回根據(jù)自己的需要去設置如相關的數(shù)據(jù)源。

因此,我覺得可以設置多個數(shù)據(jù)源啊,但是有個問題是,你這是想干嘛呢?想讓列表如何顯示,不同的數(shù)據(jù)源分區(qū)塊顯示?

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

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

22.#import 跟#include 又什么區(qū)別 #import<> 跟 #import""又什么區(qū)別?

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

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

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

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

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

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

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

27.什么是安全釋放?

28.為什么有些4.0獨有的objective-c 函數(shù)在3.1上運行時會報錯.而4.0獨有的類在3.1上分配內(nèi)存時不會報錯?分配的結(jié)果是什么?

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

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

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

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

34.Cocoa中有虛基類的概念么?怎么簡潔的實現(xiàn)?

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

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

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

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

for(intindex =0; index <20; index ++){NSString*tempStr = @”tempStr”;NSLog(tempStr);NSNumber*tempNumber = [NSNumbernumberWithInt:2];NSLog(tempNumber);}

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

誰申請,誰釋放

遵循Cocoa Touch的使用原則;

內(nèi)存管理主要要避免“過早釋放”和“內(nèi)存泄漏”,對于“過早釋放”需要注意@property設置特性時,一定要用對特性關鍵字,對于“內(nèi)存泄漏”,一定要申請了要負責釋放,要細心。 關鍵字alloc 或new 生成的對象需要手動釋放;

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

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

39.怎樣實現(xiàn)一個 singleton的類.給出思路。

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

41.線程與進程的區(qū)別和聯(lián)系?

進程和線程都是由操作系統(tǒng)所體會的程序運行的基本 單元,系統(tǒng)利用該基本單元實現(xiàn)系統(tǒng)對應用的并發(fā)性。

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

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

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

44.ios平臺怎么做數(shù)據(jù)的持久化?coredata和sqlite有無必然聯(lián)系?coredata是一個關系型數(shù)據(jù)庫嗎?

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

mac os x中sqlite庫,它是一個輕量級功能強大的關系數(shù)據(jù)引擎,也很容易嵌入到應用程序??梢栽诙鄠€平臺使用,sqlite是一個輕量級的嵌入式sql數(shù)據(jù)庫編程。與core data框架不同的是,sqlite是使用程序式的,sql的主要的API來直接操作數(shù)據(jù)表。

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

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

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

48.響應者鏈是什么?

UIResponder類,是UIKIT中一個用于處理事件響應的基類。窗口上的所有事件觸發(fā),都由該類響應(即事件處理入口)。所以,窗口上的 View及控制器都是派生于該類的,例如UIView、UIViewController等。調(diào)用UIResponder類提供的方法或?qū)傩?,我們就可?捕捉到窗口上的所有響應事件,并進行處理。下面將詳細介紹。

一、應用場景

使 用事件響應,最典型的場景就是頁面導航了。我們知道,一個UIView,是不能直接嵌入UINavigationController容器下的(只有 UIViewController可以),這就意味著,如果當前的頁面是一個UIView或其子控件(例如自定義的UITableViewCell等), 當前頁面就無法使用pushViewController進行導航了。這時,就可以調(diào)用? ? ? ? ? ? ? +? UIResponder下的nextResponder屬性,獲得 當前的事件響應類。最終交由UIViewController響應,這時UIView就可以使用pushViewController方法了。

二、事件響應的流程

1、一個UIView發(fā)出一個事件之后,首先上傳給其父視圖;

2、父視圖上傳給其所在的控制器;

3、如果其控制器對事件進行處理,事件傳遞將終止,否則繼續(xù)上傳父視圖;

4、直到遇到響應者才會停止,否則事件將一直上傳,直到UIWindow。

49.unix上進程怎么通信?

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

1.基本通信:主要用來協(xié)調(diào)進程間的同步和互斥

(1)鎖文件通信

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

(2)記錄鎖文件

2.管道通信:適應大批量的數(shù)據(jù)傳遞

3.IPC? ? :適應大批量的數(shù)據(jù)傳遞

50.timer的間隔周期準嗎?為什么?怎樣實現(xiàn)一個精準的timer?

51.UIscrollVew用到了什么設計模式?還能再foundation庫中找到類似的嗎?(答案眾多,不知道哪個是對的~~)

模板(Template)模式,所有datasource和delegate接口都是模板模式的典型應用,

組合模式composition,所有的containerview都用了這個模式

觀察者模式observer,所有的UIResponder都用了這個模式。

52如果要開發(fā)一個類似eclipse的軟件,支持插件結(jié)構。且開放給第三方開發(fā)。你會怎樣去設計它?(大概思路)

main()

{inta[5]={1,2,3,4,5};int*ptr=(int*)(&a+1);printf("%d,%d",*(a+1),*(ptr-1));}

答:2,5

(a+1)就是a[1],(ptr-1)就是a[4],執(zhí)行結(jié)果是2.5,&a+1不是首地址+1,系統(tǒng)會認為加一個a數(shù)組的偏 移,是偏移了一個數(shù)組的大小(本例是5個int,intptr=(int)(&a+1);則ptr實際 是&(a[5]),也就是a+5

原因如下:

+? &a是數(shù)組指針,其類型為 int (*)[5];

而指針加1要根據(jù)指針類型加上一定的值,不同類型的指針+1之后增加的大小不同。a是長度為5的int數(shù)組指針,所以要加 5sizeof(int)所以ptr實際是a[5],但是prt與(&a+1)類型是不一樣的(這點很重要),所以prt-1只會減去 sizeof(int),a,&a的地址是一樣的,但意思不一樣,a是數(shù)組首地址,也就是a[0]的地址,&a是對象(數(shù)組)首地址,a+1是數(shù)組下一元素的地址,即a[1],&a+1是下一個對象的地址,即a[5].

54.以下為Windows NT下的32位C++程序,請計算sizeof的值

voidFunc (charstr[100] ){sizeof( str ) =?}void*p =malloc(100);sizeof( p ) = ?

這題 很常見了,Func( char str[100] )函數(shù)中數(shù)組名作為函數(shù)形參時,在函數(shù)體內(nèi),數(shù)組名失去了本身的內(nèi)涵,僅僅只是一個指針;在失去其內(nèi)涵的同時,它還失去了其常量特性,可以作自增、自減等操作,可以被修改。Windows NT 32位平臺下,指針的長度(占用內(nèi)存的大?。?字節(jié),故sizeof( str ) 、sizeof( p ) 都為4。

55.

- (void)*getNSString(constNSString*inputString){? ? inputString =@"This is a main test\n";return;}-main(void){NSString*a=@"Main";NSString*aString = [NSStringstringWithString:@"%@",getNSString(a)];NSLog(@"%@\n", aString);}

最后問輸出的字符串:NULL,output在 函數(shù)返回后,內(nèi)存已經(jīng)被釋放。

56.列舉幾種進程的同步機制,并比較其優(yōu)缺點。

原子操作信號量機制? ? 自旋鎖? ? 管程,會合,分布式系統(tǒng)

進程之間通信的途徑

共享存儲系統(tǒng)消息傳遞系統(tǒng)管道:以文件系統(tǒng)為基礎

進程死鎖的原因

資源競爭及進程推進順序非法

死鎖的4個必要條 件

互斥、請求保持、不可剝奪、環(huán)路

死鎖的處理

鴕鳥策略、預防策略、避免策略、檢測與解除死鎖

57.堆和棧的區(qū)別

管理方式:對于棧來講,是由編譯器自動管理,無需我們手工控制;對于堆來說,釋放工作由程序員控制,容易產(chǎn)生memory leak。

申請大小:

棧:在Windows下,棧是向低地址擴展的數(shù)據(jù)結(jié)構,是一塊連續(xù)的內(nèi)存的區(qū)域。這句話的意思是棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預先規(guī)定好的,在WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就確定的常數(shù)),如果申請的空間超過棧的剩余空間時,將提示 overflow。因此,能從棧獲得的空間較小。

堆:堆是向高地址擴展的數(shù)據(jù)結(jié)構,是不連續(xù)的內(nèi)存區(qū)域。這是由于系統(tǒng)是用鏈表來存儲的空閑內(nèi)存地址的,自然是不連續(xù)的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限于計算機系統(tǒng)中有效的虛擬內(nèi)存。由此可見,堆獲得的空間比較靈活,也比較大。

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

分配方式:堆都是動態(tài)分配的,沒有靜態(tài)分配的堆。棧有2種分配方式:靜態(tài)分配和動態(tài)分配。靜態(tài)分配是編譯器完成的,比如局部變量的分配。動態(tài)分配由alloca函數(shù)進行分配,但是棧的動態(tài)分配和堆是不同的,他的動態(tài)分配是由編譯器進行釋放,無需我們手工實現(xiàn)。

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

58.什么是鍵-值,鍵路徑是什么?

模型的性質(zhì)是通過一個簡單的鍵(通常是個字符串)來指定的。視圖和控制器通過鍵來查找相應的屬性值。在一個給定的實體中,同一個屬性的所有值具有相同的數(shù)據(jù)類型。鍵-值編碼技術用于進行這樣的查找—它是一種間接訪問對象屬性的機制。

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

性質(zhì)是由先前的性質(zhì)決定的,接下來每個鍵的值也是相對于其前面的性質(zhì)。鍵路徑使您可以以獨立于模型

實現(xiàn)的方式指定相關 對象的性質(zhì)。通過鍵路徑,您可以指定對象圖中的一個任意深度的路徑,使其指向相

關對象的特定屬性。

59.c和obj-c如何混用

1)obj-c的編譯器處理后綴為m的文件時,可以識別obj-c和c的代碼,處理mm文件可以識別obj-c,c,c++代碼,但cpp文件必須只能用c/c++代碼,而且cpp文件include的頭文件中,也不能出現(xiàn)obj- c的代碼,因為cpp只是cpp

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

3)在cpp中混用obj- c其實就是使用obj-c編寫的模塊是我們想要的。

如果模塊以類實現(xiàn),那么要按照cpp class的標準寫類的定義,頭文件中不能出現(xiàn)obj-c的東西,包括#import cocoa的。實現(xiàn)文件中,即類的實現(xiàn)代碼中可以使用obj-c的東西,可以import,只是后綴是mm。

如果模塊以函數(shù)實現(xiàn),那么頭文件要按 c的格式聲明函數(shù),實現(xiàn)文件中,c++函數(shù)內(nèi)部可以用obj-c,但后綴還是mm或m。

總結(jié):只要cpp文件和cpp include的文件中不包含obj-c的東西就可以用了,cpp混用obj-c的關鍵是使用接口,而不能直接使用實現(xiàn)代碼,實際上cpp混用的是 obj-c編譯后的o文件,這個東西其實是無差別的,所以可以用。obj-c的編譯器支持cpp.

60.目標-動作機制

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

動作是控件發(fā)送給目標的消息,或者從目標的角度看,它是目標為了響應動作而實現(xiàn)的方法。

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

61.cocoatouch框架

iPhoneOS 應用程序的基礎Cocoa Touch 框架重用了許多 Mac 系統(tǒng)的成熟模式,但是它更多地專注于觸摸的接口和優(yōu)化。UIKit 為您提供了在 iPhone OS 上實現(xiàn)圖形,事件驅(qū)動程序的基本工具,其建立在和 Mac OS X 中一樣的 Foundation 框架上,包括文件處理,網(wǎng)絡,字符串操作等。

CocoaTouch 具有和 iPhone 用戶接口一致的特殊設計。有了 UIKit,您可以使用 iPhone OS 上的獨特的圖形接口控件,按鈕,以及全屏視圖的功能,您還可以使用加速儀和多點觸摸手勢來控制您的應用。

各色俱全的框架 除了UIKit 外,Cocoa Touch 包含了創(chuàng)建世界一流iPhone 應用程序需要的所有框架,從三維圖形,到專業(yè)音效,甚至提供設備訪問 API 以控制攝像頭,或通過 GPS 獲知當前位置。Cocoa Touch 既包含只需要幾行代碼就可以完成全部任務的強大的 Objective-C 框架,也在需要時提供基礎的 C 語言 API 來直接訪問系統(tǒng)。這些框架包括:

CoreAnimation

通過 CoreAnimation,您就可以通過一個基于組合獨立圖層的簡單的編程模型來創(chuàng)建豐富的用戶體驗。

CoreAudio

CoreAudio 是播放,處理和錄制音頻的專業(yè)技術,能夠輕松為您的應用程序添加強大的音頻功能。

CoreData

提供了一個面向?qū)ο蟮臄?shù)據(jù)管理解決方案,它易于使用和理解,甚至可處理任何應用或大或小的數(shù)據(jù)模型。

功能列表:框架分類

下面是 CocoaTouch 中一小部分可用的框架:

音頻和視頻

Core Audio

OpenAL

Media Library

AV Foundation

數(shù)據(jù)管理

Core Data

SQLite

圖形和動畫

Core Animation

OpenGL ES

Quartz 2D

網(wǎng)絡/li>

Bonjour

WebKit

BSD Sockets

用戶應用

Address Book

Core Location

Map Kit

Store Kit

62.objc的內(nèi)存管理

如果您通過分配和初始化(比如[[MyClass alloc] init])的方式來創(chuàng)建對象,您就擁有這個對象,需要負責該對象的釋放。這個規(guī)則在使用NSObject的便利方法new 時也同樣適用.

如果您拷貝一個對象,您也擁有拷貝得到的對象,需要負責該對象的釋放.

如果您保持一個對象,您就部分擁有這個對象,需要在不再使用時釋放該對象。

如果您從其它對象那里接收到一個對象,則您不擁有該對象,也不應該釋放它(這個規(guī)則有少數(shù)的例外,在參考文檔中有顯式的說明)。

63.自動釋放池是什么,如何工作

當您向一個對象發(fā)送一個autorelease消息時,Cocoa就會將該對 象的一個引用放入到最新的自動釋放池。它仍然是個正當?shù)膶ο?,因此自動釋放池定義的作用域內(nèi)的其它對象可以向它發(fā)送消息。當程序執(zhí)行到作用域結(jié)束的位置時,自動釋放池就會被釋放,池中的所有對象也就被釋放。

1.ojc-c 是通過一種"referringcounting"(引用計數(shù))的方式來管理內(nèi)存的, 對象在開始分配內(nèi)存(alloc)的時候引用計數(shù)為一,以后每當碰到有copy,retain的時候引用計數(shù)都會加一, 每當碰到release和autorelease的時候引用計數(shù)就會減一,如果此對象的計數(shù)變?yōu)榱?, 就會被系統(tǒng)銷毀.

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

3.autorelease和release沒什么區(qū)別,只是引用計數(shù)減一的時機不同而已,autorelease會在對象的使用真正結(jié)束的時候才做引用計數(shù)減一.

64.類工廠方法是什么

類工廠方法的實現(xiàn)是為了向客戶提供方便,它們將分配和初始化合在一個步驟中, 返回被創(chuàng)建的對象,并進行自動釋放處理。這些方法的形式是+ (type)className...(其中 className不包括任何前綴)。

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

類工廠方法的另一個目的是使類(比如NSWorkspace)提供單件實例。雖 然init...方法可以確認一個類在每次程序運行過程只存在一個實例,但它需要首先分配一個“生的”實例,然后還必須釋放該實例。

工廠 方法則可以避免為可能沒有用的對象盲目分配內(nèi)存。

65.單件實例是什么

Foundation和Application Kit 框架中的一些類只允許創(chuàng)建單件對象,即這些類在當前進程中的唯一實例。舉例來說,NSFileManager和NSWorkspace 類在使用時都是基于進程進行單件對象的實例化。當向這些類請求實例的時候,它們會向您傳遞單一實例的一個引用,如果該實例還不存在,則首先進行實例的分配和初始化。 單件對象充當控制中心的角色,負責指引或協(xié)調(diào)類的各種服務。如果類在概念上只有一個實例(比如NSWorkspace),就應該產(chǎn)生一個單件實例,而不是多個實例;如果將來某一天可能有多個實例,您可以使用單件實例機制,而不是工廠方法或函數(shù)。

66.動態(tài)綁定—在運行時確定要調(diào)用的方法

動態(tài)綁定將調(diào)用方法的確定也推遲到運行時。在編譯時,方法的調(diào)用并不和代碼綁定在一起,只有在消實發(fā)送出來之后,才確定被調(diào)用的代碼。通過動態(tài)類型和動態(tài)綁定技術,您的代碼每次執(zhí)行都可以得到不同的結(jié)果。運行時因子負責確定消息的接 收者和被調(diào)用的方法。運行時的消息分發(fā)機制為動態(tài)綁定提供支持。當您向一個動態(tài)類型確定了的對象發(fā)送消息時,運行環(huán)境系統(tǒng)會通過接收者的isa指針定位對象的類,并以此為起點確定被調(diào)用的方法,方法和消息是動態(tài)綁定的。而且,您不必在Objective-C 代碼中做任何工作,就可以自動獲取動態(tài)綁定的好處。您在每次發(fā)送消息時,

特別是當消息的接收者是動態(tài)類型已經(jīng)確定的對象時,動態(tài)綁定就會例行而 透明地發(fā)生。

67.obj-c的優(yōu)缺點

objc優(yōu)點:

1)Cateogies

2) Posing

3) 動態(tài)識別

4) 指標計算

5)彈性訊息傳遞

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

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

缺點:

1) 不支援命名空間

2)? 不支持運算符重載

3) 不支持多重繼承

4) 使用動態(tài)運行時類型,所有的方法都是函數(shù)調(diào)用,所以很多編譯時優(yōu)化方法都用不到。(如內(nèi)聯(lián)函數(shù)等),性能低劣。

68.readwrite,readonly,assign,retain,copy,nonatomic 屬性的作用?

1,@property是 一個屬性訪問聲明,擴號內(nèi)支持以下幾個屬性:

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

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

2,assign,setter方法直接賦值,不進行 任何retain操作,為了解決原類型與環(huán)循引用問題

3,retain,setter方法對參數(shù)進行release舊值再retain新值,所有 實現(xiàn)都是這個順序(CC上有相關資料)

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

5,nonatomic,非原子性訪問,不加同步, 多線程并發(fā)訪問會提高性能。注意,如果不加此屬性,則默認是兩個訪問方法都為原子型事務訪問。鎖被加到所屬對象實例級(我是這么理解的…)。

69.ViewController的 didReceiveMemoryWarning 是在什么時候被調(diào)用的?(87題)

70.談談你對ARC 的認識和理解?

ARC是iOS 5推出的新功能,全稱叫 ARC(Automatic Reference Counting)。簡單地說,就是代碼中自動加入了retain/release,原先需要手動添加的用來處理內(nèi)存管理的引用計數(shù)的代碼可以自動地由編譯器完成了。簡單地理解ARC,就是通過指定的語法,讓編譯器(LLVM3.0)在編譯代碼時,自動生成實例的引用計數(shù)管理部分代碼。有一點,ARC并不是GC,它只是一種代碼靜態(tài)分析(Static Analyzer)工具。

基本的ARC使用規(guī)則

代碼中不能使用retain, release, retain, autorelease

不重載dealloc(如果是釋放對象內(nèi)存以外的處理,是可以重載該函數(shù)的,但是不能調(diào)用[super dealloc])

不能使用NSAllocateObject, NSDeallocateObject

不能在C結(jié)構體中使用對象指針

id與void *間的如果cast時需要用特定的方法(__bridge關鍵字)

?? ? ? ? 不能使用NSAutoReleasePool、而需要@autoreleasepool塊

?? ? ? ? 不能使用“new”開始的屬性名稱 (如果使用會有下面的編譯錯誤”Property’s synthesized getter follows Cocoa naming convention for returning ‘owned’ objects”)

ARC工作原理是在編譯程序的時候由xCode將內(nèi)存操作的代碼(如:retain,release 和 autorelease)自動添加到需要的位置。

ARC 只能在iOS4 和iOS5上使用,weak refrences 只能在iOS5上使用,并且只能是工程在ARC管理內(nèi)存的時候才能用。

老版本的工程是可以轉(zhuǎn)換成使用ARC的工程,轉(zhuǎn)換規(guī)則包括:

1.去掉所有的retain,release,autorelease

2.把NSAutoRelease替換成@autoreleasepool{}塊

3.把assign的屬性變?yōu)閣eak

使用ARC的一些強制規(guī)定

1.不能直接調(diào)用dealloc方法,不能調(diào)用retain,release,autorelease,reraubCount方法,包括@selector(retain)的方式也不行

2.截圖租戶事故宣布dealloc方法來管理一些資源,但不能用來釋放實例變量,也不能在dealloc方法里面去掉[super dealloc]方法,在ARC下父類的dealloc同樣由編譯器來自動完成

3.Core Foundation類型的對象任然可以用CFRetain,CFRelease這些方法

4.不能在使用NSAllocateObject和NSDeallocateObject對象

5.不能在c結(jié)構體中使用對象指針,如果有類似功能可以創(chuàng)建一個Objective-c類來管理這些對象

6.在id和void *之間沒有簡便的轉(zhuǎn)換方法,同樣在Objective-c和core Foundation類型之間的轉(zhuǎn)換都需要使用編譯器制定的轉(zhuǎn)換函數(shù)

7.不能再使用NSAutoreleasePool對象,ARC提供了@autoreleasepool塊來代替它,這樣更加有效率

8.不能使用內(nèi)存存儲區(qū)(不能再使用NSZone)

9.不能以new為開頭給一個屬性命名

10.聲明outlet時一般應當使用weak,除了對StoryBoard 這樣nib中間的頂層對象要用strong

11.weak 相當于老版本的assign,strong相當于retain

71.ObjC中,與alloc語義相反的方法是dealloc還是release?與retain語義相反的方法是dealloc還是release,為什么?需要與alloc配對使用的方法是dealloc還是release,為什么?

alloc與dealloc語意相反,alloc是創(chuàng)建變量,dealloc是釋放變量。 retain 對應release,retain 保留一個對象。調(diào)用之后,變量的計數(shù)加1。或許不是很明顯,在這有例為證:

- (void)setName : (NSString*) name {? ? [name retain];? ? [myname release];? ? myname = name; }

我們來解釋一下:設想,用戶在調(diào)用這個函數(shù)的時候,他注意了內(nèi)存的管理,所以他小心的寫了如下代碼:

NSString* newname = [[NSStringalloc] initWithString:@"John"];[aClasssetName: newname];[newnamerelease];

我們來看一看newname的計數(shù)是怎么變化的。首先,它被alloc,count = 1; 然后,在setName中,它被retain,count = 2; 最后,用戶自己釋放newname,count= 1,myname指向了newname。這也解釋了為什么需要調(diào)用[myname release]。我們需要在給myname賦新值的時候,釋放掉以前老的變量。retain 之后直接dealloc對象計數(shù)器沒有釋放。alloc 需要與release配對使用,因為alloc 這個函數(shù)調(diào)用之后,變量的計數(shù)加1。所以在調(diào)用alloc 之后,一定要調(diào)用對應的release。另外,在release一個變量之后,他的值仍然有效,所以最好是后面緊接著再var = nil。

72.在一個對象的方法里面:

self.name = “object”;

name =”object”

有什么不同?

73.這段代碼有什么問題:

@implementationPerson- (void)setAge:(int)newAge {self.age= newAge;}@end

74.什么是retaincount?

retainCount返回當前內(nèi)存的引用計數(shù)值。當內(nèi)存被開辟后,默認的引用計數(shù)為1 。

75.以下每行代碼執(zhí)行后,person對象的retain count分別是多少

Person *person = [[Person alloc] init];[person retain];[personrelease];[personrelease];

76.為什么很多內(nèi)置類如UITableViewController的delegate屬性都是assign而不是retain的?

會引起循環(huán)引用。

這里delegate我們只是想得到實現(xiàn)了它delegate方法的對象,然后拿到這個對象的指針就可以了,我們不期望去改變它或者做別的什么操作,所以我們只要用assign拿到它的指針就可以了。

而用retain的話,計數(shù)器加1。我們有可能在別的地方期望釋放掉delegate這個對象,然后通過一些判斷比如說它是否已經(jīng)被釋放,做一些操作。但 是實際上它retainCount還是1,沒有被釋放掉,要在UITableViewController的dealloc里面才被釋放掉(這里我只是舉 個例子,一般retain的對象都是在dealloc里被釋放)。這里就會造成一些問題出現(xiàn)。

而如果你確定不會有沖突的問題出現(xiàn)的話,或者你也希望用到delegate的這個對象,直到你不用它為止,那么用retain也未嘗不可,只是需要最后release一次。

77.定義屬性時,什么情況使用copy,assign,和retain?

assign用于簡單數(shù)據(jù)類型,如NSInteger,double,bool,retain和copy用戶對象,copy用于當 a指向一個對象,b也想指向同樣的對象的時候,如果用assign,a如果釋放,再調(diào)用b會crash,如果用copy 的方式,a和b各自有自己的內(nèi)存,就可以解決這個問題。retain 會使計數(shù)器加一,也可以解決assign的問題。另外:atomic和nonatomic用來決定編譯器生成的getter和setter是否為原子操作。在多線程環(huán)境下,原子操作是必要的,否則有可能引起錯誤的結(jié)果。加了atomic,setter函數(shù)會變成下面這樣:

if(property != newValue) {? ? ? [propertyrelease];? ? ? property = [newValueretain];? }

78.autorelease的對象是在什么時候被release的?

autorelease實際上只是把對release的調(diào)用延遲了,對于每一個Autorelease,系統(tǒng)只是把該Object放入了當前的 Autoreleasepool中,當該pool被釋放時,該pool中的所有Object會被調(diào)用Release。對于每一個Runloop,系統(tǒng)會隱式創(chuàng)建一個Autoreleasepool,這樣所有的releasepool會構成一個象CallStack一樣的一個棧式結(jié)構,在每一個 Runloop結(jié)束時,當前棧頂?shù)腁utoreleasepool會被銷毀,這樣這個pool里的每個Object(就是autorelease的對象)會被release。那什么是一個Runloop呢?一個UI事件,Timer call,delegate call, 都會是一個新的Runloop。那什么是一個Runloop呢?一個UI事件,Timer call,delegate call, 都會是一個新的Runloop。

79.這段代碼有什么問題,如何修改

for(inti =0; i < someLargeNumber; i++){NSString *string= @”Abc”;string= [stringlowercaseString];string= [stringstringByAppendingString:@"xyz"];NSLog(@“%@”,string);}

80.autorelease和垃圾回收機制(gc)有什么關系?IPhone OS有沒有垃圾回收(gc)?

81.Objective C中的protocal是什么?

@protocal obj里面的協(xié)議就如同java里面的interface。

82.Objective C中的selector 是什么?

你可以理解 @selector()就是取類方法的編號,他的行為基本可以等同C語言的中函數(shù)指針,只不過C語言中,可以把函數(shù)名直接賦給一個函數(shù)指針,而 Objective-C的類不能直接應用函數(shù)指針,這樣只能做一個@selector語法來取.它的結(jié)果是一個SEL類型。這個類型本質(zhì)是類方法的編號 (函數(shù)地址)。

83.Objective C中的category是什么?

Objective-C提供了一個非常靈活的類(Class)擴展機制-類別(Category)。類別用于對一個已經(jīng)存在的類添加方法 (Methods)。你只需要知道這個類的公開接口,不需要知道類的源代碼。需要注意的是,類別不能為已存在的類添加實例變量(Instance Variables)。

子類(subclassing)是進行類擴展的另一種常用方法。與子類相比,類別最主要的優(yōu)點是:系統(tǒng)中已經(jīng)存在的類可以不需修改就可使用類別的擴展功能。

類別的第二大優(yōu)點是實現(xiàn)了功能的局部化封裝。類別定義可以放在一個已存在的類(類A)的定義文件中(.h)。這意味著這個類別只有在類A被引用的前提下才會被外部看到。如果另一個類(類B)不需要用到類A的功能(沒有包含類A的.h文件),也就不會看到依附類A存在的類別。iOS SDK中廣泛運用這種類別定義法來封裝功能。

84.什么是Notification?什么時候用delegate,什么時候用Notification?

觀察者模式,controller向defaultNotificationCenter添加自己的notification,其他類注冊這個 notification就可以收到通知,這些類可以在收到通知時做自己的操作(多觀察者默認隨機順序發(fā)通知給觀察者們,而且每個觀察者都要等當前的某個觀察者的操作做完才能輪到他來操作,可以用NotificationQueue的方式安排觀察者的反應順序,也可以在添加觀察者中設定反映時間,取消觀察需要在viewDidUnload跟dealloc中都要注銷)。

delegate針對one-to-one關系,并且reciever可以返回值給sender,notification可以針對one-to- one/many/none,reciever無法返回值給sender.所以,delegate用于sender希望接受到reciever的某個功能反饋值,

notification用于通知多個object某個事件。

85.什么是KVC和KVO?Notification、delegate和KVO有什么不同?KVO在ObjC中是怎么實現(xiàn)的?、

KVC,即是指 NSKeyValueCoding,一個非正式的 Protocol,提供一種機制來間接訪問對象的屬性。KVO 就是基于 KVC 實現(xiàn)的關鍵技術之一。Key-Value Observing (KVO) 建立在 KVC 之上,它能夠觀察一個對象的 KVC key path 值的變化。

1.效率肯定是delegate比nsnotification高。

2.delegate方法比notification更加直接,最典型的特征是,delegate方法往往需要關注返回值, 也就是delegate方法的結(jié)果。和delegate一樣,KVO和NSNotification的作用也是類與類之間的通信,與delegate不同的是

1)這兩個都是負責發(fā)出通知,剩下的事情就不管了,所以沒有返回值;

2)delegate只是一對一,而這兩個可以一對多。這兩者也有各自的特點。

86.ViewController 的 loadView,viewDidLoad, viewDidUnload 分別是在什么時候調(diào)用的?在自定義ViewController的時候這幾個函數(shù)里面應該做什么工作?

viewDidLoad在view 從nib文件初始化時調(diào)用,loadView在controller的view為nil時調(diào)用。此方法在編程實現(xiàn)view時調(diào)用,view 控制器默認會注冊memory warning notification,當view controller的任何view 沒有用的時候,viewDidUnload會被調(diào)用,在這里實現(xiàn)將retain 的view release,如果是retain的IBOutlet view 屬性則不要在這里release,IBOutlet會負責release 。

87.ViewController 的didReceiveMemoryWarning 是在什么時候被調(diào)用的?UIViewController類中didReceiveMemoryWarning默認的操作是什么?

默認調(diào)用[superdidReceiveMemoryWarning]

88.UITableViewController 中,創(chuàng)建UITableViewCell時,initWithSytle:resuseIdentifier中,reuseIdentifier有什么用?簡述UITableViewCell的復用原理.

復用隊列的元素增加:只有在cell被滑動出界面的時候,此cell才會被加入到復用隊列中。每次在創(chuàng)建cell的時候,程序會首先通過調(diào)用 dequeueReusableCellWithIdentifier:cellType方法,到復用隊列中去尋找標示符為“cellType”的 cell,如果找不到,返回nil,然后程序去通過調(diào)用[[[UITableViewCell alloc]initWithStyle:style reuseIdentifier:cellType] autorelease]來創(chuàng)建標示符為“cellType”的cell。

89.UIView 和CALayer 有什么區(qū)別?

兩者最大的區(qū)別是,圖層不會直接渲染到屏幕上。

以 UIView 類animateWithDuration:animations: 為例,簡述UIView動畫原理。

UIView對象中支持動畫的幾個屬性:? frame,? bounds,? center,? transform,? alpha。

ios通過視圖來展示屏幕上的內(nèi)容,但是UIView類的許多基礎行為卻嚴重依賴于另外一個對象。 UIKit每個視圖對象的背后都有一個? ? CoreAnimation層對象,它是一個CALayer類的實例,該類為視圖內(nèi)容的渲染,布局,合成以及動畫提供基礎性的支持。

和MacOS不同的是,ios將CoreAnimation集成到視圖渲染實現(xiàn)的核心。 由于SDK中UIKit提供了透明的接口,開發(fā)者大部分情況下,不必去關心和直接訪問CoreAnimation。 但是如果要實現(xiàn)特別復雜的渲染和動畫,就需要使用到CoreAnimation的接口支持了。

CoreAnimation的基礎

1.CoreAnimation利用了硬件加速和架構上的優(yōu)化來實現(xiàn)了快速渲染和實時動畫。

2.當視圖的drawRect方法首次被調(diào)用時,層會將描畫的結(jié)果捕捉到一個位圖中,并在隨后的重繪時,盡可能使用這個位圖,以避免開銷太大。

3.CoreAnimation把和視圖對象相關聯(lián)的層存儲在層樹的層次結(jié)構中。 可以在層樹中添加特殊層,實現(xiàn)不同的效果。

4.層對象是IOS渲染和布局系統(tǒng)的推動力,大多數(shù)視圖屬性實際上是其層對象屬性的一個很薄的封裝。

5.表示樹: 層在展示給用戶時當前的狀態(tài)。

渲染樹:運行在單獨的線程上,不影響app主線程, 實現(xiàn)動畫渲染效果。

6.缺點: 由于層需要額外的緩存數(shù)據(jù),因此會耗費更多的內(nèi)存。

補充面試題

1.Object C中創(chuàng)建線程的方法是什么?如果在主線程中執(zhí)行代碼,方法是什么?如果想延時執(zhí)行代碼、方法又是什么?

線程創(chuàng)建有三種方法:使用NSThread創(chuàng)建、使用GCD的dispatch、使用子類化的NSOperation,然后將其加入NSOperationQueue;在主線程執(zhí)行代碼,方法是performSelectorOnMainThread,如果想延時執(zhí)行代碼可以用performSelector:onThread:withObject:waitUntilDone:

2、做過的項目是否涉及網(wǎng)絡訪問功能,使用什么對象完成網(wǎng)絡功能?

ASIHTTPRequest與NSURLConnection

3、簡單介紹下NSURLConnection類及

+sendSynchronousRequest:returningResponse:error:與– initWithRequest:delegate:兩個方法的區(qū)別?

NSURLConnection主要用于網(wǎng)絡訪問,其中? sendSynchronousRequest:returningResponse:error:是同步訪問數(shù)據(jù),即當前線程會阻塞,并等待request的返回的response,而– initWithRequest:delegate:使用的是異步加載,當其完成網(wǎng)絡訪問后,會通過delegate回到主線程,并其委托的對象。

4、iOS多線程常見面試題

在項目什么時候選擇使用GCD,什么時候選擇NSOperation?

項目中使用NSOperation的優(yōu)點是NSOperation是對線程的高度抽象,在項目中使用它,會使項目的程序結(jié)構更好,子類化NSOperation的設計思路,是具有面向?qū)ο蟮膬?yōu)點(復用、封裝),使得實現(xiàn)是多線程支持,而接口簡單,建議在復雜項目中使用。

項目中使用GCD的優(yōu)點是GCD本身非常簡單、易用,對于不復雜的多線程操作,會節(jié)省代碼量,而Block參數(shù)的使用,會是代碼更為易讀,建議在簡單項目中使用。

5、常見系列面試題

面試時,面試官會先問一些,是否了解block,是否使用過block,這些問題相當于開場白,往往是下面一系列問題的開始,所以一定要如實根據(jù)自己的情況回答。

1 使用block和使用delegate完成委托模式有什么優(yōu)點?

首先要了解什么是委托模式,委托模式在iOS中大量應用,其在設計模式中是適配器模式中的對象適配器,Objective-C中使用id類型指向一切對象,使委托模式更為簡潔。了解委托模式的細節(jié):

iOS設計模式----委托模式

使用block實現(xiàn)委托模式,其優(yōu)點是回調(diào)的block代碼塊定義在委托對象函數(shù)內(nèi)部,使代碼更為緊湊;

適配對象不再需要實現(xiàn)具體某個protocol,代碼更為簡潔。

2 多線程與block

GCD與Block

使用 dispatch_async 系列方法,可以以指定的方式執(zhí)行block

GCD編程實例

dispatch_async的完整定義

voiddispatch_async(dispatch_queue_tqueue,? dispatch_block_t block);

功能:在指定的隊列里提交一個異步執(zhí)行的block,不阻塞當前線程

通過queue來控制block執(zhí)行的線程。主線程執(zhí)行前文定義的 finishBlock對象

dispatch_async(dispatch_get_main_queue(),^(void){finishBlock();});

6、在iPhone應用中如何保存數(shù)據(jù)?

有以下幾種保存機制:

1.通過web服務,保存在服務器上

2.通過NSCoder固化機制,將對象保存在文件中

3.通過SQlite或CoreData保存在文件數(shù)據(jù)庫中

7、什么是coredata?

coredata框架是apple提供的一套通用自動的解決方案,包括了對象生存周期、對象關系圖、持久化機制。

補充答案:上面是翻譯的,按我個人理解coredata提供一種一機制,讓我們可以方便的把 內(nèi)存中對象,及對象間的關系,映射到coredata,然后由它為我們持久化數(shù)據(jù)。相比普通的文件數(shù)據(jù)庫SQlite,它的功能更強大,不需要我們先將對 象數(shù)據(jù)format成SQL語句,存入數(shù)據(jù)庫,再用select語句讀出,而現(xiàn)在是從內(nèi)存到coredata的數(shù)據(jù)管理,我們只需管理coredata的 managed對象。是蘋果提供一套數(shù)據(jù)保存

8、coredata有哪幾種持久化存儲機制?

coredatat提供以下幾種存儲機制:XML(iOS系統(tǒng)不支持),自動存儲,SQLite,內(nèi)存存儲。

補充說明:這個問題問的是,coredate框架的存儲機制,平時使用coredata時,更多關注的是managed的對象,這里是coerdata框架的存儲實現(xiàn)細節(jié)。BTW: 其他常用的持久化存儲方法 :存入到文件、 存入到NSUserDefaults(系統(tǒng)plist文件中)。

9、什么是NSManagedObject模型?什么是NSManagedobjectContext?

NSManagedObject是NSObject的子類 ,也是coredata的重要組成部分,它是一個通用的類,實現(xiàn)了core data 模型層所需的基本功能,用戶可通過子類化NSManagedObject,建立自己的數(shù)據(jù)模型。

NSManagedobjectContext對象負責應用和數(shù)據(jù)庫之間的交互。

10、什么是謂詞?

謂詞是通過NSPredicate,是通過給定的邏輯條件作為約束條件,完成對數(shù)據(jù)的篩選。

predicate = [NSPredicatepredicateWithFormat:@"customerID == %d",n];? ? a = [customers filteredArrayUsingPredicate:predicate];

Leader級別的高級Cocoa/CocoaTouch開發(fā)工程師

1.你使用過Objective-C的運行時編程(RuntimeProgramming)么?如果使用過,你用它做了什么?你還能記得你所使用的相關的頭文件或者某些方法的名稱嗎?

Objecitve-C的重要特性是Runtime(運行時),在#import 下能看到相關的方法,用過objc_getClass()和class_copyMethodList()獲取過私有API;使用

Method method1 = class_getInstanceMethod(cls, sel1);Method method2 = class_getInstanceMethod(cls, sel2);method_exchangeImplementations(method1, method2);

代碼交換兩個方法,在寫unit test時使用到。

2.你實現(xiàn)過多線程的Core Data么?? ? NSPersistentStoreCoordinator,NSManagedObjectContext和NSManagedObject中的哪些需要在線程中創(chuàng)建或者傳遞?你是用什么樣的策略來實現(xiàn)的?

沒實現(xiàn)過多線程的CoreData(待實踐)


3.Core開頭的系列的內(nèi)容。是否使用過CoreAnimation和CoreGraphics。UI框架和CA,CG框架的聯(lián)系是什么?分別用CA和CG做過些什么動畫或者圖像上的內(nèi)容。(有需要的話還可以涉及Quartz的一些內(nèi)容)

UI框架的底層有CoreAnimation,CoreAnimation的底層有? ? CoreGraphics。

UIKit |

------------ |

Core Animation |

Core Graphics |

Graphics Hardware|

使用CA做過menu菜單的展開收起(太遜了)

4.是否使用過CoreText或者CoreImage等?如果使用過,請談談你使用CoreText或者CoreImage的體驗。

CoreText可以解決復雜文字內(nèi)容排版問題。CoreImage可以處理圖片,為其添加各種效果。體驗是很強大,挺復雜的。

5.NSNotification和KVO的區(qū)別和用法是什么?什么時候應該使用通知,什么時候應該使用KVO,它們的實現(xiàn)上有什么區(qū)別嗎?如果用 protocol和delegate(或者delegate的Array)來實現(xiàn)類似的功能可能嗎?如果可能,會有什么潛在的問題?如果不能,為什么? (雖然protocol和delegate這種東西面試已經(jīng)面爛了…)

NSNotification是通知模式在iOS的實現(xiàn),KVO的全稱是鍵值觀察(Key-value observing),其是基于KVC(key-value coding)的,KVC是一個通過屬性名訪問屬性變量的機制。例如將Module層的變化,通知到多個Controller對象時,可以使用 NSNotification;如果是只需要觀察某個對象的某個屬性,可以使用KVO。

對于委托模式,在設計模式中是對象適配器模式,其是delegate是指向某個對象的,這是一對一的關系,而在通知模式中,往往是一對多的關系。委托模 式,從技術上可以現(xiàn)在改變delegate指向的對象,但不建議這樣做,會讓人迷惑,如果一個delegate對象不斷改變,指向不同的對象。

6.你用過NSOperationQueue么?如果用過或者了解的話,你為什么要使用NSOperationQueue,實現(xiàn)了什么?請描述它和GCD的區(qū)別和類似的地方(提示:可以從兩者的實現(xiàn)機制和適用范圍來描述)。

使用NSOperationQueue用來管理子類化的NSOperation對象,控制其線程并發(fā)數(shù)目。GCD和NSOperation都可以實現(xiàn)對線 程的管理,區(qū)別是 NSOperation和NSOperationQueue是多線程的面向?qū)ο蟪橄?。項目中使用NSOperation的優(yōu)點是NSOperation是 對線程的高度抽象,在項目中使用它,會使項目的程序結(jié)構更好,子類化NSOperation的設計思路,是具有面向?qū)ο蟮膬?yōu)點(復用、封裝),使得實現(xiàn)是 多線程支持,而接口簡單,建議在復雜項目中使用。

項目中使用GCD的優(yōu)點是GCD本身非常簡單、易用,對于不復雜的多線程操作,會節(jié)省代碼量,而Block參數(shù)的使用,會是代碼更為易讀,建議在簡單項目中使用。

更詳細的答案見我的這篇文章

7.既然提到GCD,那么問一下在使用GCD以及block時要注意些什么?它們兩是一回事兒么?block在ARC中和傳統(tǒng)的MRC中的行為和用法有沒有什么區(qū)別,需要注意些什么?

使用block是要注意,若將block做函數(shù)參數(shù)時,需要把它放到最后,GCD是Grand Central Dispatch,是一個對線程開源類庫,而Block是閉包,是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)。更詳細的答案見我的這篇文章

8.您是否做過異步的網(wǎng)絡處理和通訊方面的工作?如果有,能具體介紹一些實現(xiàn)策略么?

使用NSOperation發(fā)送異步網(wǎng)絡請求,使用NSOperationQueue管理線程數(shù)目及優(yōu)先級,底層是用NSURLConnetion,詳細 可見開源框架LWConnetion。

9.對于Objective-C,你認為它最大的優(yōu)點和最大的不足是什么?對于不足之處,現(xiàn)在有沒有可用的方法繞過這些不足來實現(xiàn)需求。如果可以的話,你有沒有考慮或者實踐過重新實現(xiàn)OC的一些功能,如果有,具體會如何做?

最大的優(yōu)點是它的運行時特性,不足是沒有命名空間,對于命名沖突,可以使用長命名法或特殊前綴解決,如果是引入的第三方庫之間的命名沖突,可以使用link命令及flag解決沖突。

10.你實現(xiàn)過一個框架或者庫以供別人使用么?如果有,請談一談構建框架或者庫時候的經(jīng)驗;如果沒有,請設想和設計框架的public的API,并指出大概需要如何做、需要注意一些什么方面,來使別人容易地使用你的框架。

抽象和封裝,方便使用。首先是對問題有充分的了解,比如構建一個文件解壓壓縮框架,從使用者的角度出發(fā),只需關注發(fā)送給框架一個解壓請求,框架完成復雜文 件的解壓操作,并且在適當?shù)臅r候通知給是哦難過者,如解壓完成、解壓出錯等。在框架內(nèi)部去構建對象的關系,通過抽象讓其更為健壯、便于更改。其次是API 的說明文檔。

這些問題,多數(shù)是沒有統(tǒng)一的正確答案的,問題有深度,又是在平時工作會用到的,非常適合大家一起討論

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 1.objective-c常見面試題:1、**OC **語言的基本特點OC 語言是 C 語言的一個超集,只是在 C...
    LZM輪回閱讀 1,031評論 0 3
  • 設計模式是什么? 你知道哪些設計模式,并簡要敘述? 設計模式是一種編碼經(jīng)驗,就是用比較成熟的邏輯去處理某一種類型的...
    Jt_Self閱讀 836評論 0 4
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,656評論 30 472
  • 1、簡述你對協(xié)議的理解? protocol無論是在哪一個領域中都是一種規(guī)范和約束;在Object—C中協(xié)議主要用于...
    陪你看日出去閱讀 621評論 0 6
  • 你走的第五年我又回到了那座屬于你的城市! 下飛機時已經(jīng)是黃昏時分,北半球的這個時節(jié)總是早早的開始落日,光暈給這座城...
    小漫畫_閱讀 555評論 0 2

友情鏈接更多精彩內(nèi)容