IOS 常見面試題


1.Difference between shallow copy and deep copy?

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

淺層復(fù)制:只復(fù)制指向?qū)ο蟮闹羔槪粡?fù)制引用對(duì)象本身。

深層復(fù)制:復(fù)制引用對(duì)象本身。

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

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

兩份獨(dú)立對(duì)象本身。

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

淺復(fù)制好比你和你的影子,你完蛋,你的影子也完蛋

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

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

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

category 可以在不獲悉,不改變?cè)瓉泶a的情況下往里面添加新的方法,只能添加,不能刪除修改。

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

類別主要有3個(gè)作用:

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

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

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

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

3.Difference between categories and extensions?

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

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

extensions可以認(rèn)為是一個(gè)私有的Category。

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

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

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

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

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

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

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

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

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

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

5.What are KVO and KVC?

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

很多情況下可以簡(jiǎn)化程序代碼。 apple文檔其實(shí)給了一個(gè)很好的例子。

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

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

比如我自定義的一個(gè)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];}}

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

對(duì)于kvc機(jī)制如何通過key尋找到value:

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

NSUndefinedKeyException 異常錯(cuò)誤。

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

設(shè)計(jì)valueForUndefinedKey:方法的主要目的是當(dāng)你使用-(id)valueForKey方法從對(duì)象中請(qǐng)求值時(shí),對(duì)象能夠在錯(cuò)誤發(fā)生前,有最后的機(jī)會(huì)響應(yīng)這個(gè)請(qǐng)求。這樣做有很多好處,下面的兩個(gè)例子說明了這樣做的好處。“

來至cocoa,這個(gè)說法應(yīng)該挺有道理。

因?yàn)槲覀冎?button卻是存在一個(gè)highlighted實(shí)例變量.因此為何上面我們只是add一個(gè)相關(guān)的keypath就行了,

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

6.What is purpose of delegates?

代理的作用?

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

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

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

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

可修改不可修改的集合類。這個(gè)我個(gè)人簡(jiǎn)單理解就是可動(dòng)態(tài)添加修改和不可動(dòng)態(tài)添加修改一樣。

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

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

我們說的obc是動(dòng)態(tài)運(yùn)行時(shí)語(yǔ)言是什么意思?

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

這個(gè)問題其實(shí)淺涉及到兩個(gè)概念,運(yùn)行時(shí)和多態(tài)。

簡(jiǎn)單來說,運(yùn)行時(shí)機(jī)制使我們直到運(yùn)行時(shí)才去決定一個(gè)對(duì)象的類別,以及調(diào)用該類別對(duì)象指定方法。

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

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

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

因此也可以說,運(yùn)行時(shí)機(jī)制是多態(tài)的基礎(chǔ)?~~~

9.what is difference between NSNotification and protocol?

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

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

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

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

代理按我們的理解,到不是直接說不能一對(duì)多,比如我們知道的明星經(jīng)濟(jì)代理人,很多時(shí)候一個(gè)經(jīng)濟(jì)人負(fù)責(zé)好幾個(gè)明星的事務(wù)。

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

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

因此控制鏈(has-a從英語(yǔ)單詞大致可以看出,單一擁有和可控制的對(duì)應(yīng)關(guān)系。

10.What is push notification?

什么是推送消息?

11.Polymorphism?

關(guān)于多態(tài)性

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

這個(gè)題目其實(shí)可以出到一切面向?qū)ο笳Z(yǔ)言中,

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

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

12.Singleton?

對(duì)于單例的理解

11,12題目其實(shí)出的有點(diǎn)泛泛的感覺了,可能說是編程語(yǔ)言需要或是必備的基礎(chǔ)。

基本能用熟悉的語(yǔ)言寫出一個(gè)單例,以及可以運(yùn)用到的場(chǎng)景或是你編程中碰到過運(yùn)用的此種模式的框架類等。

進(jìn)一步點(diǎn),考慮下如何在多線程訪問單例時(shí)的安全性。

13.What is responder chain?

說說響應(yīng)鏈

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

可以說點(diǎn)事件的分發(fā),傳遞以及處理。具體可以去看下touch事件這塊。因?yàn)閱柕奶橄蠡?/p>

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

14.Difference between frame and bounds?

frame和bounds有什么不同?

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

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

15.Difference between method and selector?

方法和選擇器有何不同?

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

詳情可以看apple文檔。

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

OBC的垃圾回收機(jī)制?

OBC2.0有Garbage collection,但是iOS平臺(tái)不提供。

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

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

17.NSOperation queue?

存放NSOperation的集合類。

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

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

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

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

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

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

但是后來看到一票關(guān)于這操作隊(duì)列話題的文章,其中有一句提到

“因?yàn)閮蓚€(gè)操作提交的時(shí)間間隔很近,線程池中的線程,誰(shuí)先啟動(dòng)是不定的。”

瞬間覺得這個(gè)queue名字有點(diǎn)忽悠人了,還不如pool~

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

18.What is lazy loading?

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

我覺得最好也最簡(jiǎn)單的一個(gè)列子就是tableView中圖片的加載顯示了。

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

19.Can we use two tableview controllers on one viewcontroller?

是否在一個(gè)視圖控制器中嵌入兩個(gè)tableview控制器?

一個(gè)視圖控制只提供了一個(gè)View視圖,理論上一個(gè)tableViewController也不能放吧,

只能說可以嵌入一個(gè)tableview視圖。當(dāng)然,題目本身也有歧義,如果不是我們定性思維認(rèn)為的UIViewController,而是宏觀的表示視圖控制者,那我們倒是可以把其看成一個(gè)視圖控制者,它可以控制多個(gè)視圖控制器,比如TabbarController那樣的感覺。

20.Can we use one tableview with two different datasources? How you will achieve this?

一個(gè)tableView是否可以關(guān)聯(lián)兩個(gè)不同的數(shù)據(jù)源?你會(huì)怎么處理?

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

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

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

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

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

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

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

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

24.id 聲明的對(duì)象有什么特性?

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

25.MVC是什么?有什么特性?為什么在iPhone上被廣泛運(yùn)用?

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

26.對(duì)于語(yǔ)句NSString* testObject = [[NSData alloc] init];testObject 在編譯時(shí)和運(yùn)行時(shí)分別是什么類型的對(duì)象?

27.什么是安全釋放?

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

29.為什么4.0獨(dú)有的c函數(shù)在3.1的機(jī)器上運(yùn)行不會(huì)報(bào)錯(cuò)(在沒有調(diào)用的情況下?)而4.0獨(dú)有的類名在3.1的機(jī)器上一運(yùn)行就報(bào)錯(cuò)?

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

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

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

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

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

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

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

36.這段代碼有什么問題.?會(huì)不會(huì)造成內(nèi)存泄露(多線程)?在內(nèi)存緊張的設(shè)備上做大循環(huán)時(shí)自動(dòng)釋放池是寫在循環(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)存管理的幾條原則時(shí)什么?按照默認(rèn)法則.那些關(guān)鍵字生成的對(duì)象需要手動(dòng)釋放?在和property結(jié)合的時(shí)候怎樣有效的避免內(nèi)存泄露?

誰(shuí)申請(qǐng),誰(shuí)釋放

遵循Cocoa Touch的使用原則;

內(nèi)存管理主要要避免“過早釋放”和“內(nèi)存泄漏”,對(duì)于“過早釋放”需要注意@property設(shè)置特性時(shí),一定要用對(duì)特性關(guān)鍵字,對(duì)于“內(nèi)存泄漏”,一定要申請(qǐng)了要負(fù)責(zé)釋放,要細(xì)心。 關(guān)鍵字alloc 或new 生成的對(duì)象需要手動(dòng)釋放;

設(shè)置正確的property屬性,對(duì)于retain需要在合適的地方釋放,

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

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

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

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

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

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

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

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

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

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

mac os x中sqlite庫(kù),它是一個(gè)輕量級(jí)功能強(qiáng)大的關(guān)系數(shù)據(jù)引擎,也很容易嵌入到應(yīng)用程序。可以在多個(gè)平臺(tái)使用,sqlite是一個(gè)輕量級(jí)的嵌入式sql數(shù)據(jù)庫(kù)編程。與core data框架不同的是,sqlite是使用程序式的,sql的主要的API來直接操作數(shù)據(jù)表。

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

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

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

48.響應(yīng)者鏈?zhǔn)鞘裁矗?/p>

UIResponder類,是UIKIT中一個(gè)用于處理事件響應(yīng)的基類。窗口上的所有事件觸發(fā),都由該類響應(yīng)(即事件處理入口)。所以,窗口上的 View及控制器都是派生于該類的,例如UIView、UIViewController等。調(diào)用UIResponder類提供的方法或?qū)傩裕覀兙涂梢?捕捉到窗口上的所有響應(yīng)事件,并進(jìn)行處理。下面將詳細(xì)介紹。

一、應(yīng)用場(chǎng)景

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

二、事件響應(yīng)的流程

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

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

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

4、直到遇到響應(yīng)者才會(huì)停止,否則事件將一直上傳,直到UIWindow。

49.unix上進(jìn)程怎么通信?

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

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

(1)鎖文件通信

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

(2)記錄鎖文件

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

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

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

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

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

組合模式composition,所有的containerview都用了這個(gè)模式

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

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

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)會(huì)認(rèn)為加一個(gè)a數(shù)組的偏 移,是偏移了一個(gè)數(shù)組的大小(本例是5個(gè)int,intptr=(int)(&a+1);則ptr實(shí)際 是&(a[5]),也就是a+5

原因如下:

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

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

54.以下為Windows NT下的32位C++程序,請(qǐng)計(jì)算sizeof的值

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

這題 很常見了,Func( char str[100] )函數(shù)中數(shù)組名作為函數(shù)形參時(shí),在函數(shù)體內(nèi),數(shù)組名失去了本身的內(nèi)涵,僅僅只是一個(gè)指針;在失去其內(nèi)涵的同時(shí),它還失去了其常量特性,可以作自增、自減等操作,可以被修改。Windows NT 32位平臺(tái)下,指針的長(zhǎng)度(占用內(nèi)存的大小)為4字節(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.列舉幾種進(jìn)程的同步機(jī)制,并比較其優(yōu)缺點(diǎn)。

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

進(jìn)程之間通信的途徑

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

進(jìn)程死鎖的原因

資源競(jìng)爭(zhēng)及進(jìn)程推進(jìn)順序非法

死鎖的4個(gè)必要條 件

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

死鎖的處理

鴕鳥策略、預(yù)防策略、避免策略、檢測(cè)與解除死鎖

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

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

申請(qǐng)大小:

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

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

碎片問題:對(duì)于堆來講,頻繁的new/delete勢(shì)必會(huì)造成內(nèi)存空間的不連續(xù),從而造成大量的碎片,使程序效率降低。對(duì)于棧來講,則不會(huì)存在這個(gè) 問題,因?yàn)闂J窍冗M(jìn)后出的隊(duì)列,他們是如此的一一對(duì)應(yīng),以至于永遠(yuǎn)都不可能有一個(gè)內(nèi)存塊從棧中間彈出

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

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

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

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

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

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

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

關(guān)對(duì)象的特定屬性。

59.c和obj-c如何混用

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

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

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

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

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

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

60.目標(biāo)-動(dòng)作機(jī)制

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

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

程序需要某些機(jī)制來進(jìn)行事件和指令的翻譯。這個(gè)機(jī)制就是目標(biāo)-動(dòng)作機(jī)制。

61.cocoatouch框架

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

CocoaTouch 具有和 iPhone 用戶接口一致的特殊設(shè)計(jì)。有了 UIKit,您可以使用 iPhone OS 上的獨(dú)特的圖形接口控件,按鈕,以及全屏視圖的功能,您還可以使用加速儀和多點(diǎn)觸摸手勢(shì)來控制您的應(yīng)用。

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

CoreAnimation

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

CoreAudio

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

CoreData

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

功能列表:框架分類

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

音頻和視頻

Core Audio

OpenAL

Media Library

AV Foundation

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

Core Data

SQLite

圖形和動(dòng)畫

Core Animation

OpenGL ES

Quartz 2D

網(wǎng)絡(luò)/li>

Bonjour

WebKit

BSD Sockets

用戶應(yīng)用

Address Book

Core Location

Map Kit

Store Kit

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

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

如果您拷貝一個(gè)對(duì)象,您也擁有拷貝得到的對(duì)象,需要負(fù)責(zé)該對(duì)象的釋放.

如果您保持一個(gè)對(duì)象,您就部分擁有這個(gè)對(duì)象,需要在不再使用時(shí)釋放該對(duì)象。

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

63.自動(dòng)釋放池是什么,如何工作

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

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

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

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

64.類工廠方法是什么

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

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

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

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

65.單件實(shí)例是什么

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

66.動(dòng)態(tài)綁定—在運(yùn)行時(shí)確定要調(diào)用的方法

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

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

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

objc優(yōu)點(diǎn):

1)Cateogies

2) Posing

3) 動(dòng)態(tài)識(shí)別

4) 指標(biāo)計(jì)算

5)彈性訊息傳遞

6) 不是一個(gè)過度復(fù)雜的 C 衍生語(yǔ)言

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

缺點(diǎn):

1) 不支援命名空間

2)? 不支持運(yùn)算符重載

3) 不支持多重繼承

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

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

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

1,getter=getterName,setter=setterName,設(shè)置setter與 getter的方法名

2,readwrite,readonly,設(shè)置可供訪問級(jí)別

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

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

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

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

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

70.談?wù)勀銓?duì)ARC 的認(rèn)識(shí)和理解?

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

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

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

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

不能使用NSAllocateObject, NSDeallocateObject

不能在C結(jié)構(gòu)體中使用對(duì)象指針

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

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

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

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

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

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

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

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

3.把a(bǔ)ssign的屬性變?yōu)閣eak

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

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

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

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

4.不能在使用NSAllocateObject和NSDeallocateObject對(duì)象

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

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

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

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

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

10.聲明outlet時(shí)一般應(yīng)當(dāng)使用weak,除了對(duì)StoryBoard 這樣nib中間的頂層對(duì)象要用strong

11.weak 相當(dāng)于老版本的assign,strong相當(dāng)于retain

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

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

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

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

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

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

72.在一個(gè)對(duì)象的方法里面:

self.name = “object”;

name =”object”

有什么不同?

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

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

74.什么是retaincount?

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

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

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

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

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

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

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

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

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

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

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

78.autorelease的對(duì)象是在什么時(shí)候被release的?

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

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

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

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

81.Objective C中的protocal是什么?

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

82.Objective C中的selector 是什么?

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

83.Objective C中的category是什么?

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

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

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

84.什么是Notification?什么時(shí)候用delegate,什么時(shí)候用Notification?

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

delegate針對(duì)one-to-one關(guān)系,并且reciever可以返回值給sender,notification可以針對(duì)one-to- one/many/none,reciever無(wú)法返回值給sender.所以,delegate用于sender希望接受到reciever的某個(gè)功能反饋值,

notification用于通知多個(gè)object某個(gè)事件。

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

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

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

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

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

2)delegate只是一對(duì)一,而這兩個(gè)可以一對(duì)多。這兩者也有各自的特點(diǎn)。

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

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

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

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

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

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

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

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

以 UIView 類animateWithDuration:animations: 為例,簡(jiǎn)述UIView動(dòng)畫原理。

UIView對(duì)象中支持動(dòng)畫的幾個(gè)屬性:? frame,? bounds,? center,? transform,? alpha。

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

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

CoreAnimation的基礎(chǔ)

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

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

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

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

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

渲染樹:運(yùn)行在單獨(dú)的線程上,不影響app主線程, 實(shí)現(xiàn)動(dòng)畫渲染效果。

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

補(bǔ)充面試題

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

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

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

ASIHTTPRequest與NSURLConnection

3、簡(jiǎn)單介紹下NSURLConnection類及

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

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

4、iOS多線程常見面試題

在項(xiàng)目什么時(shí)候選擇使用GCD,什么時(shí)候選擇NSOperation?

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

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

5、常見系列面試題

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

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

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

iOS設(shè)計(jì)模式----委托模式

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

適配對(duì)象不再需要實(shí)現(xiàn)具體某個(gè)protocol,代碼更為簡(jiǎn)潔。

2 多線程與block

GCD與Block

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

GCD編程實(shí)例

dispatch_async的完整定義

voiddispatch_async(dispatch_queue_tqueue,? dispatch_block_t block);

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

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

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

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

有以下幾種保存機(jī)制:

1.通過web服務(wù),保存在服務(wù)器上

2.通過NSCoder固化機(jī)制,將對(duì)象保存在文件中

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

7、什么是coredata?

coredata框架是apple提供的一套通用自動(dòng)的解決方案,包括了對(duì)象生存周期、對(duì)象關(guān)系圖、持久化機(jī)制。

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

8、coredata有哪幾種持久化存儲(chǔ)機(jī)制?

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

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

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

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

NSManagedobjectContext對(duì)象負(fù)責(zé)應(yīng)用和數(shù)據(jù)庫(kù)之間的交互。

10、什么是謂詞?

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

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

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

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

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

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

代碼交換兩個(gè)方法,在寫unit test時(shí)使用到。

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

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


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

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

UIKit |

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

Core Animation |

Core Graphics |

Graphics Hardware|

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

4.是否使用過CoreText或者CoreImage等?如果使用過,請(qǐng)談?wù)勀闶褂肅oreText或者CoreImage的體驗(yàn)。

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

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

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

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

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

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

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

更詳細(xì)的答案見我的這篇文章

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

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

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

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

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

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

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

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

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