iOS面試題匯總整理_第1頁
iOS面試題匯總整理_第2頁
iOS面試題匯總整理_第3頁
iOS面試題匯總整理_第4頁
iOS面試題匯總整理_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、1. Difference between shallow copy and deep copy?淺復(fù)制和深復(fù)制的區(qū)別?答:淺復(fù)制是指復(fù)制對(duì)象的指針,不復(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ì)象本身。2. What is advantage of categories? Wh

2、at is difference between implementing a category and inheritance?類別的作用?繼承和類別在實(shí)現(xiàn)中有何區(qū)別?答:categories 是可以在不知道,不改變?cè)瓉泶a的情況下,往里面添加新的方法。只能添加,不能刪除和修改。并且,如果類別和原來類中的方法名沖突,則類別將覆蓋原方法,因?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 cate

3、gories and extensions?類別和類擴(kuò)展(延展)的區(qū)別?答:相同點(diǎn):都可以添加屬性和方法。不同點(diǎn):延展可以合成屬性,可以添加實(shí)例變量。4. Object c 的類可以多重繼承么?可以實(shí)現(xiàn)多個(gè)接口么?Category 是什么?重寫一個(gè)類的方式用繼承好還是分類好?為什么?答:OC 中的類不可以多重繼承,可以用protocol 委托代理來完成多繼承。可以實(shí)現(xiàn)多個(gè)接口。Category 是類別。一般情況下重寫一個(gè)方法用分類比較好,用Category 重寫類的方法,僅對(duì)本category 有效,不會(huì)影響到其他類與原有類的關(guān)系。 5.#import 跟#include 又什么區(qū)別,clas

4、s呢, import<> 跟 #import”"又什么區(qū)別?答:#import是Object C 導(dǎo)入頭文件的關(guān)鍵字,#include是C 和C+導(dǎo)入頭文件的關(guān)鍵字。使用import 頭文件會(huì)自動(dòng)只導(dǎo)入一次,不會(huì)重復(fù)導(dǎo)入,不會(huì)產(chǎn)生重復(fù)編譯。class告訴編譯器某個(gè)類的聲明,當(dāng)執(zhí)行時(shí),才去查看類的實(shí)現(xiàn)文件,可以解決頭文件的相互包含。import<>用來引入類庫或者框架的頭文件,#import“用來引入非類庫的頭文件。6. 屬性readwrite ,readonly ,assign ,retain ,copy ,nonatomic 各是什么作用,在那種情況下用?答

5、:readwrite :是可讀可寫特性,在需要生成getter 和setter 方法時(shí)用。 readonly:是只讀特性,只會(huì)生成getter 方法,不會(huì)生成setter 方法,不希望屬性在類外改變。Assign:是賦值特性,setter 方法將傳入?yún)?shù)賦值給實(shí)例變量。僅在設(shè)置變量時(shí)用。Retain:表示持有特性,setter 方法將傳入?yún)?shù)先保留再賦值,傳入?yún)?shù)的retaincount 會(huì)加1。Copy:表示賦值特性,setter 方法將傳入對(duì)象復(fù)制一份。在需要完全一份新的變量時(shí)候使用。Nonatomic :非原子操作,決定編譯器生成的getter 和setter 是否是原子操作。Atomi

6、c :表示多線程安全,一般使用nonatomic 。7. 內(nèi)存管理的幾條原則時(shí)什么?按照默認(rèn)法則. 那些關(guān)鍵字生成的對(duì)象需要手動(dòng)釋放?在和property 結(jié)合的時(shí)候怎樣有效的避免內(nèi)存泄露?答:原則:1如果使用alloc 或者copy 方法創(chuàng)建的對(duì)象,或者使用retain 保留一個(gè)對(duì)象,那么都要自己釋放對(duì)象。(即:誰申請(qǐng),誰釋放)2:在大多數(shù)情況下,申請(qǐng)內(nèi)存的語句數(shù)量和釋放內(nèi)存的語句數(shù)量應(yīng)該相等。3:盡量少使用內(nèi)存,用完后立即釋放。關(guān)鍵字:create ,copy ,alloc 和new 生成的對(duì)象需要手動(dòng)釋放。設(shè)置正確的property 屬性,對(duì)于retain 需要在合適的地方釋放,可以有效

7、避免內(nèi)存泄漏。8.What is purpose of delegates?代理的作用?答:代理的目的是改變或傳遞控制鏈。允許一個(gè)類在某些特定時(shí)刻通知到其他類,而不需要獲取到那些類的指針??梢詼p少框架的復(fù)雜度。9:static 關(guān)鍵字的作用?答:(1):在函數(shù)體內(nèi),static 變量的作用局限為該函數(shù)體,該變量的內(nèi)存只被分配一次。因此其值在下次調(diào)用時(shí)仍維持上次的值。(2):在模塊內(nèi),static 全局變量可以被模塊內(nèi)所用函數(shù)訪問,但不能被模塊外的其他函數(shù)訪問。(3):在模塊內(nèi)的static 函數(shù)只可被這一模塊內(nèi)的其他函數(shù)調(diào)用,這個(gè)函數(shù)的使用局限被限制在聲明他的模塊內(nèi)。(4):在類中的stati

8、c 成員變量屬于整個(gè)類所擁有,對(duì)類的所有對(duì)象唯有一份copy 。(5):在類中的 static 成員函數(shù)屬于整個(gè)類所擁有,這個(gè)函數(shù)不接收 this 指針,因而只能訪問類的static 成員變量。10:關(guān)鍵字const 什么含義const 意味著”只讀”,下面的聲明都是什么意思?const int a;int const a;const int *a;int * const a;int const * a const;前兩個(gè)的作用是一樣,a 是一個(gè)常整型數(shù)。第三個(gè)意味著a 是一個(gè)指向常整型數(shù)的指針(也就是,整型數(shù)是不可修改的,但指針可以)。第四個(gè)意思a 是一個(gè)指向整型數(shù)的常指針(也就是說,指針指

9、向的整型數(shù)是可以修改的,但指針是不可修改的)。最后一個(gè)意味著a 是一個(gè)指向常整型數(shù)的常指針(也就是說,指針指向的整型數(shù)是不可修改的,同時(shí)指針也是不可修改的)。結(jié)論:; 關(guān)鍵字const 的作用是為給讀你代碼的人傳達(dá)非常有用的信息,實(shí)際上,聲明一個(gè)參數(shù)為常量是為了告訴了用戶這個(gè)參數(shù)的應(yīng)用目的。如果你曾花很多時(shí)間清理其它人留下的垃圾,你就會(huì)很快學(xué)會(huì)感謝這點(diǎn)多余的信息。(當(dāng)然,懂得用const 的程序員很少會(huì)留下的垃圾讓別人來清理的。); 通過給優(yōu)化器一些附加的信息,使用關(guān)鍵字const 也許能產(chǎn)生更緊湊的代碼。; 合理地使用關(guān)鍵字const 可以使編譯器很自然地保護(hù)那些不希望被改變的參數(shù),防止其被

10、無意的代碼修改。簡而言之,這樣可以減少bug 的出現(xiàn)。欲阻止一個(gè)變量被改變,可以使用 const 關(guān)鍵字。在定義該 const 變量時(shí),通常需要對(duì)它進(jìn)行初始化,因?yàn)橐院缶蜎]有機(jī)會(huì)再去改變它了;(2)對(duì)指針來說,可以指定指針本身為 const ,也可以指定指針?biāo)傅臄?shù)據(jù)為 const ,或二者同時(shí)指定為 const ;(3)在一個(gè)函數(shù)聲明中,const 可以修飾形參,表明它是一個(gè)輸入?yún)?shù),在函數(shù)內(nèi)部不能改變其值;(4)對(duì)于類的成員函數(shù),若指定其為 const 類型,則表明其是一個(gè)常函數(shù),不能修改類的成員變量;(5)對(duì)于類的成員函數(shù),有時(shí)候必須指定其返回值為 const 類型,以使得其返回值不為“

11、左值”。11:關(guān)鍵字volatile 有什么含義?并給出三個(gè)不同例子?答:一個(gè)定義為volatile 的變量是說這變量可能會(huì)被意想不到地改變,這樣,編譯器就不會(huì)去假設(shè)這個(gè)變量的值了。精確地說就是,優(yōu)化器在用到這個(gè)變量時(shí)必須每次都小心地重新讀取這個(gè)變量的值,而不是使用保存在寄存器里的備份。下面是volatile 變量的幾個(gè)例子: 并行設(shè)備的硬件寄存器(如:狀態(tài)寄存器) 一個(gè)中斷服務(wù)子程序中會(huì)訪問到的非自動(dòng)變量(Non-automaticvariables 多線程應(yīng)用中被幾個(gè)任務(wù)共享的變量12 一個(gè)參數(shù)既可以是const 還可以是volatile 嗎?解釋為什么。答:是的。一個(gè)例子是只讀的狀態(tài)寄存

12、器。它是volatile 因?yàn)樗赡鼙灰庀氩坏降馗淖?。它是const 因?yàn)槌绦虿粦?yīng)該試圖去修改它。 13 一個(gè)指針可以是volatile 嗎?解釋為什么。答: 是的。盡管這并不很常見。一個(gè)例子是當(dāng)一個(gè)中服務(wù)子程序修該一個(gè)指向一個(gè)buffer 的指針時(shí)。14:線程和進(jìn)程的區(qū)別?進(jìn)程和線程都是由操作系統(tǒng)所體會(huì)的程序運(yùn)行的基本單元,系統(tǒng)利用該基本單元實(shí)現(xiàn)系統(tǒng)對(duì)應(yīng)用的并發(fā)性。進(jìn)程和線程的主要差別在于它們是不同的操作系統(tǒng)資源管理方式。進(jìn)程有獨(dú)立的地址空間,一個(gè)進(jìn)程崩潰后,在保護(hù)模式下不會(huì)對(duì)其它進(jìn)程產(chǎn)生影響,而線程只是一個(gè)進(jìn)程中的不同執(zhí)行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨(dú)的地址空間,一個(gè)

13、線程死掉就等于整個(gè)進(jìn)程死掉,所以多進(jìn)程的程序要比多線程的程序健壯,但在進(jìn)程切換時(shí),耗費(fèi)資源較大,效率要差一些。但對(duì)于一些要求同時(shí)進(jìn)行并且又要共享某些變量的并發(fā)操作,只能用線程,不能用進(jìn)程。 15:堆和棧的區(qū)別?管理方式:對(duì)于棧來講,是由編譯器自動(dòng)管理,無需我們手工控制;對(duì)于堆來說,釋放工作由程序員控制,容易產(chǎn)生memory leak。 申請(qǐng)大?。簵#涸赪indows 下, 棧是向低地址擴(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)的空間超過棧的剩

14、余空間時(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)分配

15、和動(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ù)雜的。16:Object-C 的內(nèi)存管理?1. 當(dāng)你使用new,alloc 和copy 方法創(chuàng)建一個(gè)對(duì)象時(shí), 該對(duì)象的保留計(jì)數(shù)器值為1. 當(dāng)你不再使用該對(duì)象時(shí), 你要負(fù)責(zé)向該對(duì)象發(fā)送一條release 或autorelease 消息.

16、 這樣, 該對(duì)象將在使用壽命結(jié)束時(shí)被銷毀.2. 當(dāng)你通過任何其他方法獲得一個(gè)對(duì)象時(shí), 則假設(shè)該對(duì)象的保留計(jì)數(shù)器值為1, 而且已經(jīng)被設(shè)置為自動(dòng)釋放, 你不需要執(zhí)行任何操作來確保該對(duì)象被清理. 如果你打算在一段時(shí)間內(nèi)擁有該對(duì)象, 則需要保留它并確保在操作完成時(shí)釋放它.3. 如果你保留了某個(gè)對(duì)象, 你需要(最終 釋放或自動(dòng)釋放該對(duì)象. 必須保持retain 方法和release 方法的使用次數(shù)相等.17:對(duì)象是什么時(shí)候被dealloc 的?引用計(jì)數(shù)為0時(shí)。autorelease 實(shí)際上只是把對(duì)release 的調(diào)用延遲了,對(duì)于每一個(gè)Autorelease ,系統(tǒng)只是把該Object 放入了當(dāng)前的Au

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

18、loop18:iOS 有沒有垃圾回收?Objective-C 2.0也是有垃圾回收機(jī)制的,但是只能在Mac OS X Leopard 10.5 以上的版本使用。19:怎么理解MVC ,在Cocoa 中MVC 是怎么實(shí)現(xià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)者。 20:id 、nil 代表什么?id 和void *并非完全一樣。在上面的代碼中,id 是指向struc

19、t objc_object的一個(gè)指針,這個(gè)意思基本上是說,id 是一個(gè)指向任何一個(gè)繼承了Object (或者NSObject )類的對(duì)象。需要注意的是id 是一個(gè)指針,所以你在使用id 的時(shí)候不需要加星號(hào)。比如id foo=nil定義了一個(gè)nil 指針,這個(gè)指針指向NSObject 的一個(gè)任意子類。而id *foo=nil則定義了一個(gè)指針,這個(gè)指針指向另一個(gè)指針,被指向的這個(gè)指針指向NSObject 的一個(gè)子類。nil 和C 語言的NULL 相同,在objc/objc.h中定義。nil 表示一個(gè)Objctive-C 對(duì)象,這個(gè)對(duì)象的指針指向空(沒有東西就是空)。21:Object-C 有私有方

20、法嗎?私有變量呢?objective-c 類里面的方法只有兩種, 靜態(tài)方法和實(shí)例方法. 這似乎就不是完整的面向?qū)ο罅? 按照OO 的原則就是一個(gè)對(duì)象只暴露有用的東西. 如果沒有了私有方法的話, 對(duì)于一些小范圍的代碼重用就不那么順手了. 在類里面聲名一個(gè)私有方法interface Controller : NSObject NSString *something; + (voidthisIsAStaticMethod; (voidthisIsAnInstanceMethod;endinterface Controller (private -(voidthisIsAPrivateMethod;e

21、ndprivate可以用來修飾私有變量在Objective C 中,所有實(shí)例變量默認(rèn)都是私有的,所有實(shí)例方法默認(rèn)都是公有的22:retaincount ?關(guān)于引用計(jì)數(shù)?答:1:當(dāng)通過alloc 和new 初始化一個(gè)對(duì)象的時(shí)候,引用計(jì)數(shù)為1.2:當(dāng)對(duì)該對(duì)象retain 或者被另外一個(gè)對(duì)象保留或持有的時(shí)候(數(shù)組),引用計(jì)數(shù)加1.3; 當(dāng)用release 或autorelease 或其他對(duì)象取消持有時(shí),引用計(jì)數(shù)減1. 4:當(dāng)引用計(jì)數(shù)為0時(shí),系統(tǒng)會(huì)自動(dòng)調(diào)用dealloc 方法來釋放該對(duì)象。 23:self. 跟self 有什么區(qū)別?24:什么是KVO 和KVC?答案:kvc:鍵 - 值編碼是一種間接訪

22、問對(duì)象的屬性使用字符串來標(biāo)識(shí)屬性,而不是通過調(diào)用存取方法,直接或通過實(shí)例變量訪問的機(jī)制。很多情況下可以簡化程序代碼。kvo:鍵值觀察機(jī)制,他提供了觀察某一屬性變化的方法,極大的簡化了代碼。25:自動(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 是通過一種"referring counting"(引用計(jì)數(shù) 的

23、方式來管理內(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ù) 減一. 26:What are mutable and immutable typ

24、es 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)存空間。27.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)

25、系統(tǒng))28.Difference between method and selector?方法和選擇器有何不同?答案:selector 是一個(gè)方法的名字,method 是一個(gè)組合體,包含了名字和實(shí)現(xiàn). 29.What is lazy loading?答案:懶漢模式,只在用到的時(shí)候才去初始化。也可以理解成延時(shí)加載。我覺得最好也最簡單的一個(gè)列子就是tableView 中圖片的加載顯示了。一個(gè)延時(shí)載,避免內(nèi)存過高,一個(gè)異步加載,避免線程堵塞。30:ios 平臺(tái)怎么做數(shù)據(jù)的持久化?coredata 和sqlite 有無必然聯(lián)系?coredata 是一個(gè)關(guān)系型數(shù)據(jù)庫嗎?iOS 中可以有四種持久化數(shù)據(jù)的方

26、式:屬性列表、對(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ù)的改

27、變進(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ì)一

28、、對(duì)多的關(guān)系。31:What is responder chain?說說響應(yīng)鏈答案:事件響應(yīng)鏈。包括點(diǎn)擊事件,畫面刷新事件等。在視圖棧內(nèi)從上至下,或者從下之上傳播??梢哉f點(diǎn)事件的分發(fā),傳遞以及處理。 32:what is difference between NSNotification and protocol?通知和協(xié)議的不同之處?答案:協(xié)議有控制鏈(has-a的關(guān)系,通知沒有。首先我一開始也不太明白,什么叫控制鏈(專業(yè)術(shù)語了)。但是簡單分析下通知和代理的行為模式,我們大致可以有自己的理解簡單來說,通知的話,它可以一對(duì)多,一條消息可以發(fā)送給多個(gè)消息接受者。代理按我們的理解,到不是直接說不能

29、一對(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)系。33.id 聲明的對(duì)象有什么特性?答:Id 聲明的對(duì)象具有運(yùn)行時(shí)的特性,即可以指向任意類型的objcetive-c 的對(duì)象;34.Objective-C 如何對(duì)內(nèi)存管理的, 說說你的看法和解決方法?答:Objective-C 的內(nèi)

30、存管理主要有三種方式ARC (自動(dòng)內(nèi)存計(jì)數(shù))、手動(dòng)內(nèi)存計(jì)數(shù)、內(nèi)存池。35.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)

31、,不可能說明天要處理A 明星要一個(gè)發(fā)布會(huì),代理人發(fā)出處理發(fā)布會(huì)的消息后,別稱B 的發(fā)布會(huì)了。但是通知就不一樣,他只關(guān)心發(fā)出通知,而不關(guān)心多少接收到感興趣要處理。因此控制鏈(has-a 從英語單詞大致可以看出,單一擁有和可控制的對(duì)應(yīng)關(guān)系。36.What is push notification?什么是推送消息?答:推送通知更是一種技術(shù)。簡單點(diǎn)就是客戶端獲取資源的一種手段。普通情況下,都是客戶端主動(dòng)的pull 。推送則是服務(wù)器端主動(dòng)push 。37.Polymorphism? 關(guān)于多態(tài)性38.Singleton? 對(duì)于單例的理解 Singleton 模式,也就是通常所說的單例模式, 主要用做應(yīng)用程

32、序的資源共享控制。 應(yīng)該說,這個(gè)模式的使用頻率非常高。 通過 Singleton 一個(gè)Class ,可以實(shí)現(xiàn)在不同窗口之間傳遞數(shù)據(jù)。 在Objective-C 中,要實(shí)現(xiàn)一個(gè) Singleton Class, 至少需要做以下四個(gè)步驟:1. 為 Singleton Object 實(shí)現(xiàn)一個(gè)靜態(tài)實(shí)例,并初始化,然后設(shè)置成nil ;2. 實(shí)現(xiàn)一個(gè)實(shí)例構(gòu)造方法 (通常命名為 sharedInstance 或者 sharedManager ) 檢查上面聲明的靜態(tài)實(shí)例是否為nil ,如果是,則新建并返回一個(gè)本類實(shí)例;3. 重寫allocWithZone : 方法,用來保證當(dāng)其他人直接使用 alloc 和in

33、it 試圖獲得一個(gè)新實(shí)例的時(shí)候,不會(huì)產(chǎn)生一個(gè)新的實(shí)例。4. 適當(dāng)?shù)貙?shí)現(xiàn) allocWithZone, copyWithZone, release 和 autorelease 。39.Can we use two tableview controllers on one viewcontroller? 是否在一個(gè)視圖控制器中嵌入兩個(gè)tableview 控制器?答案:一個(gè)視圖控制只提供了一個(gè)View 視圖,理論上一個(gè)tableViewController 也不能放吧,只能說可以嵌入一個(gè)tableview 視圖。當(dāng)然,題目本身也有歧義,如果不是我們定性思維認(rèn)為的UIViewController ,而

34、是宏觀的表示視圖控制者,那我們倒是可以把其看成一個(gè)視圖控制者,它可以控制多個(gè)視圖控制器,比如TabbarController 那樣的感覺40.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è)問

35、題是,你這是想干嘛呢?想讓列表如何顯示,不同的數(shù)據(jù)源分區(qū)塊顯示?41:tableView的重用機(jī)制?查看UITableView 頭文件,會(huì)找到NSMutableArray* visiableCells,和NSMutableDictnery* reusableTableCells兩個(gè)結(jié)構(gòu)。visiableCells 內(nèi)保存當(dāng)前顯示的cells ,reusableTableCells 保存可重用的cells 。TableView 顯示之初,reusableTableCells 為空,那么tableViewdequeueReusableCellWithIdentifier:CellIdentifie

36、r返回nil 。開始的cell 都是通過UITableViewCell alloc initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:CellIdentifier來創(chuàng)建,而且cellForRowAtIndexPath 只是調(diào)用最大顯示cell 數(shù)的次數(shù)。比如:有100條數(shù)據(jù),iPhone 一屏最多顯示10個(gè)cell 。程序最開始顯示TableView 的情況是:1, 用UITableViewCell alloc initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:Cel

37、lIdentifier創(chuàng)建10次cell ,并給cell 指定同樣的重用標(biāo)識(shí)(當(dāng)然,可以為不同顯示類型的cell 指定不同的標(biāo)識(shí) 。并且10個(gè)cell 全部都加入到visiableCells 數(shù)組,reusableTableCells 為空。2, 向下拖動(dòng)tableView ,當(dāng)cell1完全移出屏幕,并且cell11(它也是alloc 出來的,原因同上 完全顯示出來的時(shí)候。cell11加入到visiableCells ,cell1移出visiableCells ,cell1加入到reusableTableCells 。3. 接著向下拖動(dòng)tableView ,因?yàn)閞eusableTableCe

38、lls 中已經(jīng)有值,所以,當(dāng)需要顯示新的cell ,cellForRowAtIndexPath 再次被調(diào)用的時(shí)候,tableView dequeueReusableCellWithIdentifier:CellIdentifier,返回cell1。cell1加入到visiableCells ,cell1移出reusableTableCells ;cell2移出visiableCells ,cell2加入到reusableTableCells 。之后再需要顯示的Cell 就可以正常重用了。42:ViewController 的loadView 、viewDidLoad 、viewDidUnloa

39、d 分別是什么時(shí)候調(diào)用的,在自定義ViewCointroller 時(shí)在這幾個(gè)函數(shù)中應(yīng)該做什么工作?由init 、loadView 、viewDidLoad 、viewDidUnload 、dealloc 的關(guān)系說起 init 方法在init 方法中實(shí)例化必要的對(duì)象(遵從LazyLoad 思想)init 方法中初始化ViewController 本身loadView 方法當(dāng)view 需要被展示而它卻是nil 時(shí),viewController 會(huì)調(diào)用該方法。不要直接調(diào)用該方法。如果手工維護(hù)views ,必須重載重寫該方法如果使用IB 維護(hù)views ,必須不能重載重寫該方法loadView 和IB

40、 構(gòu)建view你在控制器中實(shí)現(xiàn)了loadView 方法,那么你可能會(huì)在應(yīng)用運(yùn)行的某個(gè)時(shí)候被內(nèi)存管理控制調(diào)用。 如果設(shè)備內(nèi)存不足的時(shí)候, view 控制器會(huì)收到didReceiveMemoryWarning 的消息。 默認(rèn)的實(shí)現(xiàn)是檢查當(dāng)前控制器的view 是否在使用。 如果它的view 不在當(dāng)前正在使用的view hierarchy里面,且你的控制器實(shí)現(xiàn)了loadView 方法,那么這個(gè)view 將被release, loadView方法將被再次調(diào)用來創(chuàng)建一個(gè)新的view 。viewDidLoad 方法viewDidLoad 此方法只有當(dāng)view 從nib 文件初始化的時(shí)候才被調(diào)用。 重載重寫該

41、方法以進(jìn)一步定制view在iPhone OS 3.0及之后的版本中,還應(yīng)該重載重寫viewDidUnload 來釋放對(duì)view 的任何索引viewDidLoad 后調(diào)用數(shù)據(jù)ModelviewDidUnload 方法當(dāng)系統(tǒng)內(nèi)存吃緊的時(shí)候會(huì)調(diào)用該方法(注:viewController 沒有被dealloc ) 內(nèi)存吃緊時(shí),在iPhone OS 3.0之前didReceiveMemoryWarning 是釋放無用內(nèi)存的唯一方式,但是OS 3.0及以后viewDidUnload 方法是更好的方式在該方法中將所有IBOutlet (無論是property 還是實(shí)例變量)置為nil (系統(tǒng)release

42、view時(shí)已經(jīng)將其release 掉了)在該方法中釋放其他與view 有關(guān)的對(duì)象、其他在運(yùn)行時(shí)創(chuàng)建(但非系統(tǒng)必須)的對(duì)象、在viewDidLoad 中被創(chuàng)建的對(duì)象、緩存數(shù)據(jù)等 release 對(duì)象后,將對(duì)象置為nil (IBOutlet 只需要將其置為nil ,系統(tǒng)release view時(shí)已經(jīng)將其release 掉了)一般認(rèn)為viewDidUnload 是viewDidLoad 的鏡像,因?yàn)楫?dāng)view 被重新請(qǐng)求時(shí),viewDidLoad 還會(huì)重新被執(zhí)行viewDidUnload 中被release 的對(duì)象必須是很容易被重新創(chuàng)建的對(duì)象(比如在viewDidLoad 或其他方法中創(chuàng)建的對(duì)象),

43、不要release 用戶數(shù)據(jù)或其他很難被重新創(chuàng)建的對(duì)象dealloc 方法viewDidUnload 和dealloc 方法沒有關(guān)聯(lián),dealloc 還是繼續(xù)做它該做的事情43:ViewController的didReceiveMemoryWarning 是在什么時(shí)候調(diào)用的?默認(rèn)的操作是什么?當(dāng)程序接到內(nèi)存警告時(shí)View Controller將會(huì)收到這個(gè)消息:didReceiveMemoryWarning從iOS3.0開始,不需要重載這個(gè)函數(shù),把釋放內(nèi)存的代碼放到viewDidUnload 中去。這個(gè)函數(shù)的默認(rèn)實(shí)現(xiàn)是:檢查controller 是否可以安全地釋放它的view(這里加粗的view 指的是controller 的view 屬性 ,比如view 本身沒有superview 并且可以被很容易地重建(從nib 或者loadView 函數(shù))。如果view 可以被釋放,那么這個(gè)函數(shù)釋放view 并調(diào)用viewDidUnload 。你可以重載這個(gè)函數(shù)來釋放controller 中使用的其他內(nèi)存。但要記得調(diào)用這個(gè)函數(shù)的super 實(shí)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論