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

下載本文檔

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

文檔簡介

1、1. Difference between shallow copy and deep copy?淺復(fù)制和深復(fù)制的區(qū)別?答:淺復(fù)制是指復(fù)制對象的指針,不復(fù)制對象本身。深復(fù)制是指復(fù)制引用對象本身。意思就是說我有個A 對象,復(fù)制一份后得到A_copy對象后,對于淺復(fù)制來說,A 和A_copy指向的是同一個內(nèi)存資源,復(fù)制的只不過是一個指針,對象本身資源還是只有一份,那如果我們對A_copy執(zhí)行了修改操作, 那么發(fā)現(xiàn)A 引用的對象同樣被修改,這其實違背了我們復(fù)制拷貝的一個思想。深復(fù)制就好理解了, 內(nèi)存中存在了兩份獨立對象本身。2. What is advantage of categories? Wh

2、at is difference between implementing a category and inheritance?類別的作用?繼承和類別在實現(xiàn)中有何區(qū)別?答:categories 是可以在不知道,不改變原來代碼的情況下,往里面添加新的方法。只能添加,不能刪除和修改。并且,如果類別和原來類中的方法名沖突,則類別將覆蓋原方法,因為類別具有更高的優(yōu)先級。類別主要有3個作用:(1):將類的實現(xiàn)分散到多個不同文件或者多個不同框架中。(2):創(chuàng)建對私有方法的前向引用。(3):向?qū)ο筇砑臃钦絽f(xié)議。繼承可以添加,修改方法,并且可以增加屬性。3. Difference between cate

3、gories and extensions?類別和類擴展(延展)的區(qū)別?答:相同點:都可以添加屬性和方法。不同點:延展可以合成屬性,可以添加實例變量。4. Object c 的類可以多重繼承么?可以實現(xiàn)多個接口么?Category 是什么?重寫一個類的方式用繼承好還是分類好?為什么?答:OC 中的類不可以多重繼承,可以用protocol 委托代理來完成多繼承。可以實現(xiàn)多個接口。Category 是類別。一般情況下重寫一個方法用分類比較好,用Category 重寫類的方法,僅對本category 有效,不會影響到其他類與原有類的關(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 頭文件會自動只導(dǎo)入一次,不會重復(fù)導(dǎo)入,不會產(chǎn)生重復(fù)編譯。class告訴編譯器某個類的聲明,當(dāng)執(zhí)行時,才去查看類的實現(xiàn)文件,可以解決頭文件的相互包含。import<>用來引入類庫或者框架的頭文件,#import“用來引入非類庫的頭文件。6. 屬性readwrite ,readonly ,assign ,retain ,copy ,nonatomic 各是什么作用,在那種情況下用?答

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

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

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

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

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

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

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

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

13、線程死掉就等于整個進程死掉,所以多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。但對于一些要求同時進行并且又要共享某些變量的并發(fā)操作,只能用線程,不能用進程。 15:堆和棧的區(qū)別?管理方式:對于棧來講,是由編譯器自動管理,無需我們手工控制;對于堆來說,釋放工作由程序員控制,容易產(chǎn)生memory leak。 申請大?。簵#涸赪indows 下, 棧是向低地址擴展的數(shù)據(jù)結(jié)構(gòu),是一塊連續(xù)的內(nèi)存的區(qū)域。這句話的意思是棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預(yù)先規(guī)定好的,在WINDOWS 下,棧的大小是2M (也有的說是1M ,總之是一個編譯時就確定的常數(shù)),如果申請的空間超過棧的剩

14、余空間時,將提示overflow 。因此,能從棧獲得的空間較小。堆:堆是向高地址擴展的數(shù)據(jù)結(jié)構(gòu),是不連續(xù)的內(nèi)存區(qū)域。這是由于系統(tǒng)是用鏈表來存儲的空閑內(nèi)存地址的,自然是不連續(xù)的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限于計算機系統(tǒng)中有效的虛擬內(nèi)存。由此可見,堆獲得的空間比較靈活,也比較大。碎片問題:對于堆來講,頻繁的new/delete勢必會造成內(nèi)存空間的不連續(xù),從而造成大量的碎片,使程序效率降低。對于棧來講,則不會存在這個問題,因為棧是先進后出的隊列,他們是如此的一一對應(yīng),以至于永遠都不可能有一個內(nèi)存塊從棧中間彈出分配方式:堆都是動態(tài)分配的,沒有靜態(tài)分配的堆。棧有2種分配方式:靜態(tài)分配

15、和動態(tài)分配。靜態(tài)分配是編譯器完成的,比如局部變量的分配。動態(tài)分配由alloca 函數(shù)進行分配,但是棧的動態(tài)分配和堆是不同的,他的動態(tài)分配是由編譯器進行釋放,無需我們手工實現(xiàn)。分配效率:棧是機器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu),計算機會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執(zhí)行,這就決定了棧的效率比較高。堆則是C/C+函數(shù)庫提供的,它的機制是很復(fù)雜的。16:Object-C 的內(nèi)存管理?1. 當(dāng)你使用new,alloc 和copy 方法創(chuàng)建一個對象時, 該對象的保留計數(shù)器值為1. 當(dāng)你不再使用該對象時, 你要負責(zé)向該對象發(fā)送一條release 或autorelease 消息.

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

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

18、loop18:iOS 有沒有垃圾回收?Objective-C 2.0也是有垃圾回收機制的,但是只能在Mac OS X Leopard 10.5 以上的版本使用。19:怎么理解MVC ,在Cocoa 中MVC 是怎么實現(xiàn)的? MVC 設(shè)計模式考慮三種對象:模型對象、視圖對象、和控制器對象。模型對象代表特別的知識和專業(yè)技能,它們負責(zé)保有應(yīng)用程序的數(shù)據(jù)和定義操作數(shù)據(jù)的邏輯。視圖對象知道如何顯示應(yīng)用程序的模型數(shù)據(jù),而且可能允許用戶對其進行編輯??刂破鲗ο笫菓?yīng)用程序的視圖對象和模型對象之間的協(xié)調(diào)者。 20:id 、nil 代表什么?id 和void *并非完全一樣。在上面的代碼中,id 是指向struc

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

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

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

22、問對象的屬性使用字符串來標識屬性,而不是通過調(diào)用存取方法,直接或通過實例變量訪問的機制。很多情況下可以簡化程序代碼。kvo:鍵值觀察機制,他提供了觀察某一屬性變化的方法,極大的簡化了代碼。25:自動釋放池是什么, 如何工作?當(dāng)您向一個對象發(fā)送一個autorelease 消息時,Cocoa 就會將該對 象的一個引用放入到最新的自動釋放池。它仍然是個正當(dāng)?shù)膶ο螅虼俗詣俞尫懦囟x的作用域內(nèi)的其它對象可以向它發(fā)送消息。當(dāng)程序執(zhí)行到作用域結(jié)束的位置 時,自動釋放池就會被釋放,池中的所有對象也就被釋放。1. ojc-c 是通過一種"referring counting"(引用計數(shù) 的

23、方式來管理內(nèi)存的, 對象在開始分配內(nèi)存(alloc的時候引用計數(shù)為一, 以后每當(dāng)碰到有copy,retain 的時候引用計數(shù)都會加一, 每當(dāng)碰到release 和autorelease 的時候引用計數(shù)就會減一, 如果此對象的計數(shù)變?yōu)榱?, 就會被系統(tǒng)銷毀. 2. NSAutoreleasePool 就是用來做引用計數(shù)的管理工作的, 這個東西一般不用你管的. 3. autorelease和release 沒什么區(qū)別, 只是引用計數(shù)減一的時機不同而已,autorelease 會在對象的使用真正結(jié)束的時候才做引用計數(shù) 減一. 26:What are mutable and immutable typ

24、es in Objective C?obc 中可修改和不可以修改類型。答案:可修改不可修改的集合類。這個我個人簡單理解就是可動態(tài)添加修改和不可動態(tài)添加修改一樣。比如NSArray 和NSMutableArray 。前者在初始化后的內(nèi)存控件就是固定不可變的,后者可以添加等,可以動態(tài)申請新的內(nèi)存空間。27.Difference between frame and bounds?frame 和bounds 有什么不同?答案:frame指的是:該view 在父 view 坐標系統(tǒng)中的位置和大小。(參照點是父親的坐標系統(tǒng))bounds 指的是:該view 在本身坐標系統(tǒng)中的位置和大小。(參照點是本身坐標

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

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

27、變進行保存的時候,core data會把這些數(shù)據(jù)歸檔,并永久性保存。mac os x中sqlite 庫,它是一個輕量級功能強大的關(guān)系數(shù)據(jù)引擎,也很容易嵌入到應(yīng)用程序??梢栽诙鄠€平臺使用,sqlite 是一個輕量級的嵌入式sql 數(shù)據(jù)庫編程。與core data框架不同的是,sqlite 是使用程序式的,sql 的主要的API 來直接操作數(shù)據(jù)表。Core Data不是一個關(guān)系型數(shù)據(jù)庫,也不是關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS。雖然Core Dta支持SQLite 作為一種存儲類型,但它不能使用任意的SQLite 數(shù)據(jù)庫。Core Data在使用的過程種自己創(chuàng)建這個數(shù)據(jù)庫。Core Data支持對一

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

29、一對多,比如我們知道的明星經(jīng)濟代理人,很多時候一個經(jīng)濟人負責(zé)好幾個明星的事務(wù)。只是對于不同明星間,代理的事物對象都是不一樣的,一一對應(yīng),不可能說明天要處理A 明星要一個發(fā)布會,代理人發(fā)出處理發(fā)布會的消息后,別稱B 的發(fā)布會了。但是通知就不一樣,他只關(guān)心發(fā)出通知,而不關(guān)心多少接收到感興趣要處理。因此控制鏈(has-a 從英語單詞大致可以看出,單一擁有和可控制的對應(yīng)關(guān)系。33.id 聲明的對象有什么特性?答:Id 聲明的對象具有運行時的特性,即可以指向任意類型的objcetive-c 的對象;34.Objective-C 如何對內(nèi)存管理的, 說說你的看法和解決方法?答:Objective-C 的內(nèi)

30、存管理主要有三種方式ARC (自動內(nèi)存計數(shù))、手動內(nèi)存計數(shù)、內(nèi)存池。35.what is difference between NSNotification and protocol?通知和協(xié)議的不同之處?答案:協(xié)議有控制鏈(has-a的關(guān)系,通知沒有。首先我一開始也不太明白,什么叫控制鏈(專業(yè)術(shù)語了)。但是簡單分析下通知和代理的行為模式,我們大致可以有自己的理解簡單來說,通知的話,它可以一對多,一條消息可以發(fā)送給多個消息接受者。 代理按我們的理解,到不是直接說不能一對多,比如我們知道的明星經(jīng)濟代理人,很多時候一個經(jīng)濟人負責(zé)好幾個明星的事務(wù)。只是對于不同明星間,代理的事物對象都是不一樣的,對應(yīng)

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

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

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

34、是宏觀的表示視圖控制者,那我們倒是可以把其看成一個視圖控制者,它可以控制多個視圖控制器,比如TabbarController 那樣的感覺40.Can we use one tableview with two different datasources? How you will achieve this?一個tableView 是否可以關(guān)聯(lián)兩個不同的數(shù)據(jù)源?你會怎么處理?答案:首先我們從代碼來看,數(shù)據(jù)源如何關(guān)聯(lián)上的,其實是在數(shù)據(jù)源關(guān)聯(lián)的代理方法里實現(xiàn)的。因此我們并不關(guān)心如何去關(guān)聯(lián)他,他怎么關(guān)聯(lián)上,方法只是讓我返回根據(jù)自己的需要去設(shè)置如相關(guān)的數(shù)據(jù)源。因此,我覺得可以設(shè)置多個數(shù)據(jù)源啊,但是有個問

35、題是,你這是想干嘛呢?想讓列表如何顯示,不同的數(shù)據(jù)源分區(qū)塊顯示?41:tableView的重用機制?查看UITableView 頭文件,會找到NSMutableArray* visiableCells,和NSMutableDictnery* reusableTableCells兩個結(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個cell 。程序最開始顯示TableView 的情況是:1, 用UITableViewCell alloc initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:Cel

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

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

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

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

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

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

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

溫馨提示

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

最新文檔

評論

0/150

提交評論