日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OC面试题大全

發(fā)布時(shí)間:2024/1/1 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OC面试题大全 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.Difference between shallow copy and deep copy??淺復(fù)制和深復(fù)制的區(qū)別??
答案:淺層復(fù)制:只復(fù)制指向?qū)ο蟮闹羔?#xff0c;而不復(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。 類別和類擴(kuò)展的相似之處是:都可以為類添加一個(gè)額外的方法 ? 不同之處在于:要添加額外方法,類別必須在第一個(gè)@interface中聲明方法,并且在@implementation中提供實(shí)現(xiàn),不然運(yùn)行時(shí)出錯(cuò)。而類擴(kuò)展,你添加的方法是一個(gè)required API,如果不去實(shí)現(xiàn),編譯器會(huì)警告,而且這個(gè)方法的聲明可以不在第一個(gè)@interface中去聲明。


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ī)制。?很多情況下可以簡化程序代碼。 apple文檔其實(shí)給了一個(gè)很好的例子。?kvo:鍵值觀察機(jī)制,他提供了觀察某一屬性變化的方法,極大的簡化了代碼。?具體用看到嗯哼用到過的一個(gè)地方是對(duì)于按鈕點(diǎn)擊變化狀態(tài)的的監(jiān)控。?比如我自定義的一個(gè)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]; ? } ?}
對(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í)刻通知到其他類,而不需要獲取到那些類的指針??梢詼p少框架復(fù)雜度。?另外一點(diǎn),代理可以理解為java中的回調(diào)監(jiān)聽機(jī)制的一種類似。


7.What are mutable and immutable types in Objective C??obc中可修改和不可以修改類型。?
答案:可修改不可修改的集合類。這個(gè)我個(gè)人簡單理解就是可動(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í)語言是什么意思??
答案:多態(tài)。 主要是將數(shù)據(jù)類型的確定由編譯時(shí),推遲到了運(yùn)行時(shí)。?這個(gè)問題其實(shí)淺涉及到兩個(gè)概念,運(yùn)行時(shí)和多態(tài)。?簡單來說,運(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ù)語了~)。但是簡單分析下通知和代理的行為模式,我們大致可以有自己的理解?簡單來說,通知的話,它可以一對(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從英語單詞大致可以看出,單一擁有和可控制的對(duì)應(yīng)關(guān)系。


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

?

11.Polymorphism??關(guān)于多態(tài)性?
答案:多態(tài),子類指針可以賦值給父類。?這個(gè)題目其實(shí)可以出到一切面向?qū)ο笳Z言中,?因此關(guān)于多態(tài),繼承和封裝基本最好都有個(gè)自我意識(shí)的理解,也并非一定要把書上資料上寫的能背出來。?最重要的是轉(zhuǎn)化成自我理解。


12.Singleton??對(duì)于單例的理解?
答案:11,12題目其實(shí)出的有點(diǎn)泛泛的感覺了,可能說是編程語言需要或是必備的基礎(chǔ)。?基本能用熟悉的語言寫出一個(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)閱柕奶橄蠡?嚴(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í)間間隔很近,線程池中的線程,誰先啟動(dòng)是不定的?!?瞬間覺得這個(gè)queue名字有點(diǎn)忽悠人了,還不如pool~?綜合一點(diǎn),我們知道他可以比較大的用處在于可以幫組多線程編程就好了。


18.What is lazy loading??
答案:懶漢模式,只在用到的時(shí)候才去初始化。?也可以理解成延時(shí)加載。?我覺得最好也最簡單的一個(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ì)于語句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中有虛基類的概念么?怎么簡潔的實(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.
for(int index = 0; index < 20; index ++){
NSString *tempStr = @”tempStr”;
NSLog(tempStr);
NSNumber *tempNumber = [NSNumber numberWithInt:2];
NSLog(tempNumber);
}
這段代碼有什么問題.?會(huì)不會(huì)造成內(nèi)存泄露(多線程)?在內(nèi)存緊張的設(shè)備上做大循環(huán)時(shí)自動(dòng)釋放池是寫在循環(huán)內(nèi)好還是循環(huán)外好?為什么?

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

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有無必然聯(lián)系?coredata是一個(gè)關(guān)系型數(shù)據(jù)庫嗎?
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ù)庫系統(tǒng),因?yàn)閏ore data使用內(nèi)置的sqlite數(shù)據(jù)庫。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庫,它是一個(gè)輕量級(jí)功能強(qiáng)大的關(guān)系數(shù)據(jù)引擎,也很容易嵌入到應(yīng)用程序??梢栽诙鄠€(gè)平臺(tái)使用,sqlite是一個(gè)輕量級(jí)的嵌入式sql數(shù)據(jù)庫編程。與core data框架不同的是,sqlite是使用程序式的,sql的主要的API來直接操作數(shù)據(jù)表。
Core Data不是一個(gè)關(guān)系型數(shù)據(jù)庫,也不是關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS)。雖然Core Dta支持SQLite作為一種存儲(chǔ)類型,但它不能使用任意的SQLite數(shù)據(jù)庫。Core Data在使用的過程種自己創(chuàng)建這個(gè)數(shù)據(jù)庫。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)鞘裁?#xff1f;

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庫中找到類似的嗎?(答案眾多,不知道哪個(gè)是對(duì)的~~)

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

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

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

?

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

?

53. main()

?{

? int a[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,int *ptr=(int *)(&a+1);?則ptr實(shí)際 是&(a[5]),也就是a+5?原因如下:

  &a是數(shù)組指針,其類型為 int (*)[5];?而指針加1要根據(jù)指針類型加上一定的值,不同類型的指針+1之后增加的大小不同。a是長度為5的int數(shù)組指針,所以要加 5*sizeof(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 ( char str[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)下,指針的長度(占用內(nèi)存的大小)為4字節(jié),故sizeof( str ) 、sizeof( p ) 都為4。

?

55.- (void)*getNSString(const NSString *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)管理,無需我們手工控制;對(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)行釋放,無需我們手工實(shí)現(xiàn)。

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

?

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

模型的性質(zhì)是通過一個(gè)簡單的鍵(通常是個(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í)是無差別的,所以可以用。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 語言 API 來直接訪問系統(tǒng)。這些框架包括:

CoreAnimation

通過 CoreAnimation,您就可以通過一個(gè)基于組合獨(dú)立圖層的簡單的編程模型來創(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 衍生語言?? 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 屬性的作用?

@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í)和理解?

?

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

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

- (void)setName : (NSString*) name {

??? [name retain];

??? [myname release];

??? myname = name; }

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

NSString* newname = [[NSString alloc] 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<http://self.name/> = “object”;

name =”object”

有什么不同?

?

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

@implementation Person

- (void)setAge:(int)newAge {

self.age = newAge;

}

@end

?

?74.? 什么是retaincount?

?

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

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

[person retain];

[person release];

[person release];

?

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

?

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

assign用于簡單數(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 (int i = 0; i < someLargeNumber; i++)

{

NSString *string = @”Abc”;

string = [string lowercaseString];

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語言的中函數(shù)指針,只不過C語言中,可以把函數(shù)名直接賦給一個(gè)函數(shù)指針,而 Objective-C的類不能直接應(yīng)用函數(shù)指針,這樣只能做一個(gè)@selector語法來取.它的結(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無法返回值給sender.所以,delegate用于sender希望接受到reciever的某個(gè)功能反饋值,

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

?

85. 什么是KVC和KVO?Notification和KVO有什么不同?KVO在ObjC中是怎么實(shí)現(xià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有什么用?簡述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ì)直接渲染到屏幕上。

?


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

總結(jié)

以上是生活随笔為你收集整理的OC面试题大全的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。