一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

iOS求職之OC面試題

 love蚊子 2015-04-01

1、Objective-C的類可以多重繼承么?可以采用多個協(xié)議么?

答:不可以多重繼承,可以采用多個協(xié)議。

2、#import和#include的區(qū)別是什么?#import<> 跟 #import""有什么區(qū)別?

#import能避免頭文件被重復(fù)包含的問題:

1) 一般來說,導(dǎo)入objective c的頭文件時用#import,包含c/c++頭文件時用#include。

使用include要注意重復(fù)引用的問題:

class A,class B都引用了class C,class D若引用class A與class B,就會報重復(fù)引用的錯誤。

2)#import 確定一個文件只能被導(dǎo)入一次,這使你在遞歸包含中不會出現(xiàn)問題。

所以,#import比起#include的好處就是它避免了重復(fù)引用的問題。所以在OC中我們基本用的都是import。

#import<> 包含iOS框架類庫里的類,#import""包含項目里自定義的類。

 

3、Category是什么?擴(kuò)展一個類的方式用繼承好還是類目好?為什么?

答:Category是類目。用類目好,因為繼承要滿足a is a b的關(guān)系,而類目只需要滿足a has a b的關(guān)系,局限性更小,你不用定義子類就能擴(kuò)展一個類的功能,還能將類的定義分開放在不同的源文件里, 用Category去重寫類的方法,僅對本Category有效,不會影響到其他類與原有類的關(guān)系。

 

4、延展是什么?作用是什么?

答:延展(extension):在自己類的實現(xiàn)文件中添加類目來聲明私有方法。

5、類實例(成員)變量的@protected,@private,@public聲明各有什么含義?

@protected:受保護(hù)的,該實例變量只能在該類和其子類內(nèi)訪問,其他類內(nèi)不能訪問。

@private:私有的,該實例變量只能在該類內(nèi)訪問,其他類內(nèi)不能訪問。

@public:共有的,該實例變量誰都可以訪問。

6、id聲明的對象有什么特性?

  沒有 * 號

  動態(tài)數(shù)據(jù)類型

  可以指向任何類的對象(設(shè)置是nil),而不關(guān)心其具體類型

  在運(yùn)行時檢查其具體類型

  可以對其發(fā)送任何(存在的)消息

7、委托是什么?委托和委托方雙方的property聲明用什么屬性?為什么?

委托:一個對象保存另外一個對象的引用,被引用的對象實現(xiàn)了事先確定的協(xié)議,該協(xié)議用于將引用對象中的變化通知給被引用對象。

委托和委托方雙方的property聲明屬性都是assign而不是retain

為了避免循環(huán)引用造成的內(nèi)存泄露。

      循環(huán)引用的問題這樣理解:

       比如在main函數(shù)中創(chuàng)建了兩個類的對象A和B,現(xiàn)在引用計數(shù)都是1?,F(xiàn)在讓A和B互相引用(A有一個屬性是B對象,屬性說明是retain;B有一個屬性是A對象,屬性說明是retain),現(xiàn)在兩個對象的引用計數(shù)都增加了1,都變成了2。

  現(xiàn)在執(zhí)行[A release]; [B release]; 此時創(chuàng)建對象的main函數(shù)已經(jīng)釋放了自己對對象的所有權(quán),但是此時A和B的引用計數(shù)都還是1,因為他們互相引用了。

  這時你發(fā)現(xiàn)A和B將無法釋放,因為要想釋放A必須先釋放B,在B的dealloc方法中再釋放A。同理,要想釋放B必須先釋放A,在A的dealloc方法中再釋放B。所以這兩個對象將一直存在在內(nèi)存中而不釋放。這就是所謂的循環(huán)引用的問題。要想解決這個問題,一般的方法可以將引用的屬性設(shè)置為assign,而不是retain來處理。

8、淺拷貝和深拷貝區(qū)別是什么?

       淺層復(fù)制:只復(fù)制指向?qū)ο蟮闹羔?,而不?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)存中存在了兩份獨立對象本身。

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

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

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

9、內(nèi)存管理的幾條原則是什么?按照默認(rèn)法則,哪些關(guān)鍵字生成的對象需要手動釋放?哪些情況下不需要手動釋放,會直接進(jìn)入自動釋放池?

·       當(dāng)使用new、alloc或copy方法創(chuàng)建一個對象時,該對象引用計數(shù)器為1。如果不需要使用該對象,可以向其發(fā)送release或autorelease消息,在其使用完畢時被銷毀。

·       如果通過其他方法獲取一個對象,則可以假設(shè)這個對象引用計數(shù)為1,并且被設(shè)置為autorelease,不需要對該對象進(jìn)行清理,如果確實需要retain這個對象,則需要使用完畢后release。

·       如果retain了某個對象,需要release或autorelease該對象,保持retain方法和release方法使用次數(shù)相等。

 

使用new、alloc、copy關(guān)鍵字生成的對象和retain了的對象需要手動釋放。設(shè)置為autorelease的對象不需要手動釋放,會直接進(jìn)入自動釋放池。

 

10、怎樣實現(xiàn)一個單例模式的類,給出思路,不寫代碼。

·       首先必須創(chuàng)建一個全局實例,通常存放在一個全局變量中,此全局變量設(shè)置為nil

·       提供工廠方法對該全局實例進(jìn)行訪問,檢查該變量是否為nil,如果nil就創(chuàng)建一個新的實例,最后返回全局實例

·       全局變量的初始化在第一次調(diào)用工廠方法時會在+allocWithZone:中進(jìn)行,所以需要重寫該方法,防止通過標(biāo)準(zhǔn)的alloc方式創(chuàng)建新的實例

·       為了防止通過copy方法得到新的實例,需要實現(xiàn)-copyWithZone方法

·       只需在此方法中返回本身對象即可,引用計數(shù)也不需要進(jìn)行改變,因為單例模式下的對象是不允許銷毀的,所以也就不用保留

·       因為全局實例不允許釋放,所以retain,release,autorelease方法均需重寫

11、@class的作用是什么?

答:在頭文件中, 一般只需要知道被引用的類的名稱就可以了。 不需要知道其內(nèi)部的實體變量和方法,所以在頭文件中一般使用@class來聲明這個名稱是類的名稱。 而在實現(xiàn)類里面,因為會用到這個引用類的內(nèi)部的實體變量和方法,所以需要使用#import來包含這個被引用類的頭文件。

·       @class的作用是告訴編譯器,有這么一個類,用吧,沒有問題

·       @class還可以解決循環(huán)依賴的問題,例如A.h導(dǎo)入了B.h,而B.h導(dǎo)入了A.h,每一個頭文件的編譯都要讓對象先編譯成功才行

·       使用@class就可以避免這種情況的發(fā)生

12、KVC是什么?KVO是什么?有什么特點?

·       KVC是鍵值編碼,特點是通過指定表示要訪問的屬性名字的字符串標(biāo)識符,可以進(jìn)行類的屬性讀取和設(shè)置

·       KVO是鍵值觀察,特點是利用鍵值觀察可以注冊成為一個對象的觀察者,在該對象的某個屬性變化時收到通知

13、MVC是什么?有什么特性?

–      MVC是一種設(shè)計模式,由模型、視圖、控制器3部分組成。

–      模型:保存應(yīng)用程序數(shù)據(jù)的類,處理業(yè)務(wù)邏輯的類

–      視圖:窗口,控件和其他用戶能看到的并且能交互的元素

–      控制器:將模型和試圖綁定在一起,確定如何處理用戶輸入的類

14、定義屬性時,什么情況使用copy、assign、retain?

使用assign: 對基礎(chǔ)數(shù)據(jù)類型 (NSInteger,CGFloat)和C數(shù)據(jù)類型(int, float,double, char, 等等)

使用copy: 希望獲得源對象的副本而不改變源對象內(nèi)容時,對NSString

使用retain: 希望獲得源對象的所有權(quán)時,對其他NSObject和其子類

 

15.屬性readwrite,readonly,assign,retain,copy,nonatomic 各是什么作用,在那種情況下用?

assign用于簡單數(shù)據(jù)類型,如NSInteger,double,bool,

retain和copy用于對象,

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非原子操作,決定編譯器生成的setter getter是否是原子操作,atomic表示多線程安全,一般使用nonatomic

 

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

答:Id聲明的對象具有運(yùn)行時的特性,即可以指向任意類型的objcetive-c的對象;

 

17.Objective-C如何對內(nèi)存管理的,說說你的看法和解決方法?

答:Objective-C的內(nèi)存管理主要有三種方式ARC(自動內(nèi)存計數(shù))、手動內(nèi)存計數(shù)、內(nèi)存池。

 

18.內(nèi)存管理的幾條原則時什么?

誰申請,誰釋放

遵循Cocoa Touch的使用原則;

內(nèi)存管理主要要避免“過早釋放”和“內(nèi)存泄漏”,對于“過早釋放”需要注意@property設(shè)置特性時,一定要用對特性關(guān)鍵字,對于“內(nèi)存泄漏”,一定要申請了要負(fù)責(zé)釋放,要細(xì)心。

 

19.那些關(guān)鍵字生成的對象 需要手動釋放?

答:關(guān)鍵字alloc 或new 生成的對象需要手動釋放

 

20在和property結(jié)合的時候怎樣有效的避免內(nèi)存泄露?

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

 

21.如何對iOS設(shè)備進(jìn)行性能測試?

Profile-> Instruments ->Time Profiler

22.Object-c的類可以多重繼承么?可以實現(xiàn)多個接口么?

答:Object-c的類不可以多重繼承;可以實現(xiàn)多個接口,通過實現(xiàn)多個接口可以完成C++的多重繼承;

 

23.Category是什么?重寫一個類的方式用繼承好還是分類好?為什么?

答:Category是類別,一般情況用分類好,用Category去重寫類的方法,僅對本Category有效,不會影響到其他類與原有類的關(guān)系。

 

24.描述一下iOS SDK中如何實現(xiàn)MVC的開發(fā)模式

MVC是模型、試圖、控制開發(fā)模式,對于iOS SDK,所有的View都是視圖層的,它應(yīng)該獨立于模型層,由視圖控制層來控制。所有的用戶數(shù)據(jù)都是模型層,它應(yīng)該獨立于視圖。所有的ViewController都是控制層,由它負(fù)責(zé)控制視圖,訪問模型數(shù)據(jù)

 

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

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

 

26、iPhone5 的屏幕分辨率大小為  1136* 640  ?

答:屏幕分辨率:用于量度位圖圖像內(nèi)數(shù)據(jù)量多少的一個參數(shù)。通常表示成ppi(每英寸像素Pixel per inch)。屏幕物理尺寸不變,分辨率越高,每單位面積內(nèi)包含的細(xì)節(jié)(像素點)越多。

 

27、struct strA {      int a;     float b;   char c;  } expA;       

   printf("%ld",sizeof(expA));     輸出結(jié)果為  12  ?

       該問題涉及編譯器的“內(nèi)存對齊”問題:

現(xiàn)代計算機(jī)中內(nèi)存空間都是按照byte(字節(jié))劃分的,從理論上講似乎對任何類型的變量的訪問可以從任何地址開始,但實際情況是在訪問特定變量的時候經(jīng)常在特定的內(nèi)存地址訪問,這就需要各類型數(shù)據(jù)按照一定的規(guī)則在空間上排列,而不是順序的一個接一個的排放,這就是對齊。

對齊的作用和原因:各個硬件平臺對存儲空間的處理上有很大的不同。一些平臺對某些特定類型的數(shù)據(jù)只能從某些特定地址開始存取。其他平臺可能沒有這種情況, 但是最常見的是如果不按照適合其平臺的要求對數(shù)據(jù)存放進(jìn)行對齊,會在存取效率上帶來損失。比如有些平臺每次讀都是從偶地址開始,如果一個int型(假設(shè)為 32位)如果存放在偶地址開始的地方,那么一個讀周期就可以讀出,而如果存放在奇地址開始的地方,就可能會需要2個讀周期,并對兩次讀出的結(jié)果的高低 字節(jié)進(jìn)行拼湊才能得到該int數(shù)據(jù)。顯然在讀取效率上下降很多。這也是空間和時間的博弈。

通常,我們寫程序的時候,不需要考慮對齊問題。編譯器會替我們選擇適合目標(biāo)平臺的對齊策略。當(dāng)然,我們也可以通知給編譯器傳遞預(yù)編譯指令而改變對指定數(shù)據(jù)的對齊方法。

但是,正因為我們一般不需要關(guān)心這個問題,所以因為編輯器對數(shù)據(jù)存放做了對齊,而我們不了解的話,常常會對一些問題感到迷惑。最常見的就是struct數(shù)據(jù)結(jié)構(gòu)的sizeof結(jié)果,出乎意料。

       對于結(jié)構(gòu)體來說,按成員中所占字節(jié)最大的是float類型,占用4個字節(jié),一共有3個成員,所以總的占用字節(jié)為:4* 3 = 12.

       可通過編譯器命令來設(shè)定:

      #progma pack (2)   

 

28、@property語法中readonly/readwrite,atomic/nonatomic的作用,@dynamic的作用?

      @Property:Objective-C語言關(guān)鍵詞,與@synthesize配對使用。xcode4.5以及以后的版本,@synthesize可以省略。

功能:讓編譯器自動編寫一對與數(shù)據(jù)成員同名的方法聲明來省去讀寫方法的聲明。

聲明property的語法為:

@property (參數(shù)1,參數(shù)2) 類型 名字;

如:@property(nonatomic,retain) UIWindow *window;

 

其中參數(shù)主要分為三類:

讀寫屬性: (readwrite/readonly)

setter語意:(assign/retain/copy)

原子性: (atomicity/nonatomic)

 

各參數(shù)意義如下:

readwrite:同時產(chǎn)生setter\getter方法

readonly:只產(chǎn)生簡單的getter,沒有setter。

 

assign:默認(rèn)類型,setter方法直接賦值,而不進(jìn)行retain操作

retain:setter方法對參數(shù)進(jìn)行release舊值,再retain新值。

copy:setter方法進(jìn)行Copy操作,與retain一樣

 

atomic:原子性,它沒有一個如果你沒有對原子性進(jìn)行一個聲明(atomic or nonatomic),那么系統(tǒng)會默認(rèn)你選擇的是atomic。

原子性就是說一個操作不可以被中途cpu暫停然后調(diào)度, 即不能被中斷, 要不就執(zhí)行完, 要不就不執(zhí)行. 如果一個操作是原子性的,那么在多線程環(huán)境下, 就不會出現(xiàn)變量被修改等奇怪的問題。原子操作就是不可再分的操作,在多線程程序中原子操作是一個非常重要的概念,它常常用來實現(xiàn)一些同步機(jī)制,同時也是一些常見的多線程Bug的源頭。當(dāng)然,原子性的變量在執(zhí)行效率上要低些。

關(guān)于異步與同步:并非同步就是不好,我們通常需要同時進(jìn)行多個操作,這時使用異步,而對于程序來說,一般就是使用多線程,然而我們很多時候需要在多個線程間訪問共享的數(shù)據(jù),這個時候又需要同步來保證數(shù)據(jù)的準(zhǔn)確性或訪問的先后次序。當(dāng)有多個線程需要訪問到同一個數(shù)據(jù)時,OC中,我們可以使用@synchronized(變量)來對該變量進(jìn)行加鎖(加鎖的目的常常是為了同步或保證原子操作)。

nonatomic:非原子性,是直接從內(nèi)存中取數(shù)值,因為它是從內(nèi)存中取得數(shù)據(jù),它并沒有一個加鎖的保護(hù)來用于cpu中的寄存器計算Value,它只是單純的從內(nèi)存地址中,當(dāng)前的內(nèi)存存儲的數(shù)據(jù)結(jié)果來進(jìn)行使用。在多線環(huán)境下可提高性能,但無法保證數(shù)據(jù)同步。

 

29、OSI(Open System Interconnection)開放式系統(tǒng)互聯(lián)參考模型 把網(wǎng)絡(luò)協(xié)議從邏輯上分為了7層,試列舉常見的應(yīng)用層協(xié)議。

       注意問的是應(yīng)用層協(xié)議,有些同學(xué)直接答了七層模型。

       在開放系統(tǒng)互連(OSI)模型中的最高層,為應(yīng)用程序提供服務(wù)以保證通信,但不是進(jìn)行通信的應(yīng)用程序本身。

Telnet協(xié)議是TCP/IP協(xié)議族中的一員,是Internet遠(yuǎn)程登陸服務(wù)的標(biāo)準(zhǔn)協(xié)議和主要方式。它為用戶提供了在本地計算機(jī)上完成遠(yuǎn)程主機(jī)工作的能力。

FTP文件傳輸協(xié)議是TCP/IP網(wǎng)絡(luò)上兩臺計算機(jī)傳送文件的協(xié)議,F(xiàn)TP是在TCP/IP網(wǎng)絡(luò)和INTERNET上最早使用的協(xié)議之一,它屬于網(wǎng)絡(luò)協(xié)議組的應(yīng)用層。

 

超文本傳輸協(xié)議 (HTTP-Hypertext transfer protocol) 是分布式,協(xié)作式,超媒體系統(tǒng)應(yīng)用之間的通信協(xié)議。是萬維網(wǎng)(world wide web)交換信息的基礎(chǔ)。

SMTP(Simple MailTransfer Protocol)即簡單郵件傳輸協(xié)議,它是一組用于由源地址到目的地址傳送郵件的規(guī)則,由它來控制信件的中轉(zhuǎn)方式,它幫助每臺計算機(jī)在發(fā)送或中轉(zhuǎn)信件時找到下一個目的地。

時間協(xié)議(TIME protocol)是一個在RFC 868內(nèi)定義的網(wǎng)絡(luò)協(xié)議。它用作提供機(jī)器可讀的日期時間資訊。

DNS 是域名系統(tǒng) (Domain NameSystem) 的縮寫,是因特網(wǎng)的一項核心服務(wù),它作為可以將域名和IP地址相互映射的一個分布式數(shù)據(jù)庫。

SNMP(Simple Network ManagementProtocol,簡單網(wǎng)絡(luò)管理協(xié)議)的前身是簡單網(wǎng)關(guān)監(jiān)控協(xié)議(SGMP),用來對通信線路進(jìn)行管理。

TFTP(Trivial FileTransfer Protocol,簡單文件傳輸協(xié)議)是TCP/IP協(xié)議族中的一個用來在客戶機(jī)與服務(wù)器之間進(jìn)行簡單文件傳輸?shù)膮f(xié)議,提供不復(fù)雜、開銷不大的文件傳輸服務(wù)。端口號為69。

 

30、網(wǎng)絡(luò)傳輸層協(xié)議中,基于TCP/IP協(xié)議和UDP/IP的連接有什么區(qū)別?

TCP:TransmissionControl Protocol 傳輸控制協(xié)議TCP是一種面向連接(連接導(dǎo)向)的、可靠的、基于字節(jié)流的運(yùn)輸層(Transport layer)通信協(xié)議,由IETF的RFC 793說明(specified)。

UDP 是User DatagramProtocol的簡稱, 中文名是用戶數(shù)據(jù)包協(xié)議,是OSI 參考模型中一種無連接的傳輸層協(xié)議,提供面向事務(wù)的簡單不可靠信息傳送服務(wù),IETF RFC 768是UDP的正式規(guī)范。

 

面向連接:是指通信雙方在通信時,要事先建立一條通信線路,其有三個過程:建立連接、使用連接和釋放連接。電話系統(tǒng)是一個面向連接的模式,撥號、通話、掛機(jī);TCP協(xié)議就是一種面向連接的協(xié)議。

面向無連接:是指通信雙方不需要事先建立一條通信線路,而是把每個帶有目的地址的包(報文分組)送到線路上,由系統(tǒng)自主選定路線進(jìn)行傳輸。郵政系統(tǒng)是一個無連接的模式,天羅地網(wǎng)式的選擇路線,天女散花式的傳播形式;IP、UDP協(xié)議就是一種無連接協(xié)議。

 

31、簡述MVC模式中M、V、C分別指代什么及發(fā)揮的作用?

MVC開始是存在于Desktop(桌面)程序中的,M是指數(shù)據(jù)模型,V是指用戶界面,C則是控制器,使用MVC的目的是將M和V的實現(xiàn)代碼分離。C存在的目的則是確保M和V的同步,一旦M改變,V應(yīng)該同步更新。

 

視圖是用戶看到并與之交互的界面,視圖沒有真正的處理發(fā)生,不管這些數(shù)據(jù)是聯(lián)機(jī)存儲的還是一個雇員列表,作為視圖來講,它只是作為一種輸出數(shù)據(jù)并允許用戶操縱的方式。

 

模型表示企業(yè)數(shù)據(jù)和業(yè)務(wù)規(guī)則,模型返回的數(shù)據(jù)是中立的,就是說模型與數(shù)據(jù)格式無關(guān),這樣一個模型能為多個視圖提供數(shù)據(jù),由于應(yīng)用于模型的代碼只需寫一次就可以被多個視圖重用,所以減少了代碼的重復(fù)性。

 

控制器接受用戶的輸入并調(diào)用模型和視圖去完成用戶的需求,控制器本身不輸出任何東西和做任何處理。它只是接收請求并決定調(diào)用哪個模型構(gòu)件去處理請求,然后再確定用哪個視圖來顯示返回的數(shù)據(jù)。

 

 

32、聲明@property的語法中,retain、copy、assign的含義及作用?試寫出 @property中帶retain和assign關(guān)鍵字,通過@synthesize自動生成的的合成存取方法(set、get方法)的實現(xiàn)代碼。

 

getter分析:

@property (nonatomic, retain) test*aTest;

@property (nonatomic, copy) test*aTest;

等效代碼:

-(void)aTest {

    return aTest;

}

 

========== 貌似我是分割線 ===========

@property (retain) test* aTest;

@property (copy) test* aTest;

等效代碼:

-(void)aTest

{

    [aTest  retain];

    return [aTest  autorelease];

}

 

setter分析:

@property (nonatomic, retain) test*aTest;

@property (retain) test* aTest;

等效于:

-(void)setaTest:(test *)newaTest {

    if (aTest !=newaTest) {

       [aTest  release];

       aTest = [newaTest  retain];

    }

}

========== 貌似我是分割線 ===========

@property (nonatomic, copy) test*aTest;

@property (copy) test* aTest;

等效于:

-(void)setaTest:(test *)newaTest {

    if (aTest != newaTest){

       [aTest  release];

       aTest = [newaTest  copy];

    }

}

 

33、iOS中有哪些回調(diào)機(jī)制,并作簡單的比較。

各種回調(diào)機(jī)制的比較:

1)目標(biāo)動作對:當(dāng)兩個對象之間有比較緊密的關(guān)系時,如視圖控制器與其下的某個視圖。

 

2)代理:也叫委托,當(dāng)某個對象收到多個事件,并要求同一個對象來處理所有事件時。委托機(jī)制依賴于某個協(xié)議定義的方法來發(fā)送消息。

 

3)通告機(jī)制:當(dāng)需要多個對象或兩個無關(guān)對象處理同一個事件時。

 

4)Block:適用于回調(diào)只發(fā)生一次的簡單任務(wù)。

 

34、列出在編碼中哪些編碼習(xí)慣有助于提高代碼質(zhì)量、軟件性能和健壯性,減少程序崩潰。

#使用嚴(yán)格的命名規(guī)則(如匈牙利命名法)能夠避免不必要的類型轉(zhuǎn)換錯誤。

#在編碼前先設(shè)計好流程圖或使用偽代碼,清晰化整個設(shè)計意圖。

#對自己的代碼進(jìn)行嚴(yán)格的單元測試(unit testing)。

單元測試是指對軟件中的最小可測試單元進(jìn)行檢查和驗證。如C語言中單元指一個函數(shù),Java里單元指一個類,圖形化的軟件中可以指一個窗口或一個菜單等??偟膩碚f,單元就是人為規(guī)定的最小的被測功能模塊。單元測試是在軟件開發(fā)過程中要進(jìn)行的最低級別的測試活動,軟件的獨立單元將在與程序的其他部分相隔離的情況下進(jìn)行測試。

#異常的處理

首先不要輕易使用異常的捕獲,其次要盡可能捕獲具體的異常。對于異常的處理最好能夠采用封裝的方式,大家統(tǒng)一使用。這樣可以保證異常處理的一致性也可以保證當(dāng)異常出現(xiàn)時性能的穩(wěn)定。

# 使用內(nèi)省的方法檢查方法的輸入

#采用增量式的編程方式。

采用增量式編程和測試,會傾向于創(chuàng)建更小的方法和更具內(nèi)聚性的類。你應(yīng)該經(jīng)常評估代碼質(zhì)量,并不時的進(jìn)行許多小調(diào)整,而不是一次修改許多東西。在寫了幾行代碼之后,就應(yīng)該進(jìn)行一次構(gòu)建/測試。在沒有得到反饋時,你不要走的太遠(yuǎn)。

 

#使用工具(如Instrument)來幫助檢查內(nèi)存泄漏、過早釋放內(nèi)存、CPU使用效率等問題。

#消除所有的編譯警告,警告就是錯誤。

#寫防御性的代碼,使用內(nèi)省的方法檢查傳入的參數(shù)。

 

35、JSON中{ }代表_____,[ ]代表_____,試將下面的JSON串用OC對象表示出來:

{ "people": [

{ "firstName": "Brett","lastName":"McLaughlin", "email":"aaaa" },

{ "firstName": "Jason","lastName":"Hunter", "email": "bbbb"},

{ "firstName": "Elliotte","lastName":"Harold", "email": "cccc" }

],

 “l(fā)ocation”:”中華人民共和國”

}

 

JSON中{ }代表對象,數(shù)據(jù)結(jié)構(gòu)為{key1:value1, key2:value2, key3:…… }

[ ]代表數(shù)組,與其他語言中的數(shù)組類似。

//

@interface People: NSObject

 

@property(nonatomic, copy) NSString* strFirstName;

@property(nonatomic, copy) NSString* strLastName;

@property(nonatomic, copy) NSString* strEmail;

 

@end

 

//

@interfaceJSonData : NSObject

 

@property(nonatomic, retain) NSMutableArray* arrPeople;  // 存放People對象

@property(nonatomic, copy) NSString* strLocation;

 

@end

 

36.  Object-C有多繼承嗎?沒有的話用什么代替?

答:沒有,cocoa 中所有的類都是NSObject 的子類,多繼承在這里是用protocol 委托代理來實現(xiàn)的? ,ood的多態(tài)特性在obj-c中通過委托來實現(xiàn)。

 

37.bject-C有私有方法嗎?私有變量呢?

objective-c – 類里面的方法只有兩種, 靜態(tài)方法和實例方法.

在類里面聲名一個私有方法?@interface Controller : NSObject

{ NSString *something;

}?+ (void)thisIsAStaticMethod;?–(void)thisIsAnInstanceMethod;?@end?@interface Controller

(private)

-(void)thisIsAPrivateMethod;?@end

@private可以用來修飾私有變量?在Objective‐C中,所有實例變量默認(rèn)都是私有的,所有實例方法默認(rèn)都是公有的

 

38.  堆和棧的區(qū)別?

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

申請大?。簵#簵J窍虻偷刂窋U(kuò)展的數(shù)據(jù)結(jié)構(gòu),是一塊連續(xù)的內(nèi)存的區(qū)域

                   堆:是向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是不連續(xù)的內(nèi)存區(qū)域。

分配方式:堆都是動態(tài)分配的 ,動態(tài)分配由alloca函數(shù)進(jìn)行分配 

                   棧的動態(tài)分配由編譯器進(jìn)行釋放,無需我們手工實現(xiàn) 

39. kvc和kvo的區(qū)別?

kvc:鍵值編碼,是一種間接訪問對象的屬性,使用字符串來標(biāo)示屬性

kvo:鍵值觀察機(jī)制,提供了觀察某一屬性變化的方法

 

40. 線程和進(jìn)程的區(qū)別?

答:主要不同的是操作系統(tǒng)資源管理方式

線程是一個進(jìn)程中不同的執(zhí)行路徑,線程有自己的堆、局部變量

進(jìn)程有獨立的地址空間,一個線程死掉,整個進(jìn)程就會死掉

 

41.  #import和#include的區(qū)別,@class代表什么?

答:@class一般用于頭文件中需要聲明該類的某個實例變量的時候用到,在m文件中還是需要使用#import?而#import比起#include的好處就是不會引起重復(fù)包含。

 

42. 類別的作用?

答:有時我們需要在一個已經(jīng)定義好的類中增加一些方法,而不想去重寫該類??梢允褂妙悇e對該類擴(kuò)充新的方法。

注意:類別只能擴(kuò)充方法,而不能擴(kuò)充成員變量。

   代理的作用

委托代理(degegate),目的是改變和傳遞控制鏈

    顧名思義,把某個對象要做的事情委托給別的對象去做。那么別的對象就是這個對象的代理,代替它來打理要做的事。反映到程序中,首先要明確一個對象的委托方是哪個對象,委托所做的內(nèi)容是什么。

委托機(jī)制是一種設(shè)計模式。

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

 

43.鏈表和數(shù)組的區(qū)別在哪里?

二者都屬于一種數(shù)據(jù)結(jié)構(gòu)

從邏輯結(jié)構(gòu)來看

1. 數(shù)組必須事先定義固定的長度(元素個數(shù)),不能適應(yīng)數(shù)據(jù)動態(tài)地增減的情況。當(dāng)數(shù)據(jù)增加時,可能超出原先定義的元素個數(shù);當(dāng)數(shù)據(jù)減少時,造成內(nèi)存浪費(fèi);數(shù)組可以根據(jù)下標(biāo)直接存取。

2. 鏈表動態(tài)地進(jìn)行存儲分配,可以適應(yīng)數(shù)據(jù)動態(tài)地增減的情況,且可以方便地插入、刪除數(shù)據(jù)項。(數(shù)組中插入、刪除數(shù)據(jù)項時,需要移動其它數(shù)據(jù)項,非常繁瑣)鏈表必須根據(jù)next指針找到下一個元素

從內(nèi)存存儲來看

1. (靜態(tài))數(shù)組從棧中分配空間, 對于程序員方便快速,但是自由度小

2. 鏈表從堆中分配空間, 自由度大但是申請管理比較麻煩

 

從上面的比較可以看出,如果需要快速訪問數(shù)據(jù),很少或不插入和刪除元素,就應(yīng)該用數(shù)組;相反, 如果需要經(jīng)常插入和刪除元素就需要用鏈表數(shù)據(jù)結(jié)構(gòu)了。

 

 

44. 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)會認(rèn)為加一個a數(shù)組的偏移,是偏移了一個數(shù)組的大?。ū纠?個int)   

    int *ptr=(int *)(&a+1);則ptr實際是&(a[5]),也就是a+5

原因如下:&a是數(shù)組指針,其類型為 int (*)[5];

   而指針加1要根據(jù)指針類型加上一定的值,不同類型的指針+1之后增加的大小不同?! ?/p>

   a是長度為5的int數(shù)組指針,所以要加 5*sizeof(int),所以ptr實際是a[5],

   但是prt與(&a+1)類型是不一樣的(這點很重要),所以prt-1只會減去sizeof(int*)  

    a,&a的地址是一樣的,但意思不一樣    

    a是數(shù)組首地址,也就是a[0]的地址,&a是對象(數(shù)組)首地址,         a+1是數(shù)組下一元素的地址,即a[1],&a+1是下一個對象的地址,即a[5].

 

45. 寫一個委托的interface

@protocol MyDelegate;

@interface MyClass: NSObject

{    id <MyDelegate> delegate; }

//委托方法@protocol MyDelegate- (void)didJobs:(NSArray *)args;

@end

 

46. 寫一個NSString類的實現(xiàn)

+(id)initWithCString:(const char *)nullTerminatedCStringencoding:(NSStringEncoding)encoding;

+ (id)stringWithCString: (const char*)nullTerminatedCString             encoding: (NSStringEncoding)encoding

 {   NSString *obj; 

     obj = [selfallocWithZone: NSDefaultMallocZone()];  

     obj = [objinitWithCString: nullTerminatedCString encoding: encoding];  

     returnAUTORELEASE(obj);

}

 

47. 關(guān)鍵字const有什么含意?修飾類呢?static的作用,用于類呢?還有extern c的作用

const意味著"只讀",下面的聲明都是什么意思? 

const int a; 

int const a; 

const int *a; 

int * const a; 

int const * a const;

前兩個的作用是一樣,a是一個常整型數(shù)。第三個意味著a是一個指向常整型數(shù)的指針(也就是,整型數(shù)是不可修改的,但指針可以)。第四個意思a是一個指向整型數(shù)的常指針(也就是說,指針指向的整型數(shù)是可以修改的,但指針是不可修改的)。最后一個意味著a是一個指向常整型數(shù)的常指針(也就是說,指針指向的整型數(shù)是不可修改的,同時指針也是不可修改的)。

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

(1)欲阻止一個變量被改變,可以使用 const 關(guān)鍵字。在定義該 const 變量時,通常需要對它進(jìn)行初 始化,因為以后就沒有機(jī)會再去改變它了;(2)對指針來說,可以指定指針本身為 const,也可以指定指針?biāo)傅臄?shù)據(jù)為 const,或二者同時指 定為 const;

(3)在一個函數(shù)聲明中,const 可以修飾形參,表明它是一個輸入?yún)?shù),在函數(shù)內(nèi)部不能改變其值; (4)對于類的成員函數(shù),若指定其為 const 類型,則表明其是一個常函數(shù),不能修改類的成員變量; (5)對于類的成員函數(shù),有時候必須指定其返回值為 const 類型,以使得其返回值不為“左值”。

關(guān)鍵字volatile有什么含意?并給出三個不同的例子。一個定義為volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設(shè)這個變量的值了。精確地說就是,優(yōu)化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用保存在寄存器里的備份。下面是volatile變量的幾個例子: 

· ;并行設(shè)備的硬件寄存器(如:狀態(tài)寄存器) 

· ; 一個中斷服務(wù)子程序中會訪問到的非自動變量(Non-automatic variables)

· ; 多線程應(yīng)用中被幾個任務(wù)共享的變量

· ;一個參數(shù)既可以是const還可以是volatile嗎?解釋為什么。 

· ; 一個指針可以是volatile 嗎?解釋為什么。 

下面是答案: 

· ; 是的。一個例子是只讀的狀態(tài)寄存器。它是volatile因為它可能被意想不到地改變。它是const因為程序不應(yīng)該試圖去修改它。 

·; 是的。盡管這并不很常見。一個例子是當(dāng)一個中服務(wù)子程序修該一個指向一個buffer的指針時。 

static關(guān)鍵字的作用:

(1)函數(shù)體內(nèi) static 變量的作用范圍為該函數(shù)體,不同于 auto 變量,該變量的內(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)在類中的 static 成員變量屬于整個類所擁有,對類的所有對象只有一份拷貝;

(5)在類中的 static 成員函數(shù)屬于整個類所擁有,這個函數(shù)不接收 this 指針,因而只能訪問類的static 成員變量。

 

extern "C"的作用:

(1)被 extern "C"限定的函數(shù)或變量是 extern 類型的;     

 extern是 C/C++語言中表明函數(shù)和全局變量作用范圍(可見性)的關(guān)鍵字,該關(guān)鍵字告訴編譯器,其聲明的函數(shù)和變量可以在本模塊或其它模塊中使用。

(2)被 extern "C"修飾的變量和函數(shù)是按照 C 語言方式編譯和連接的;

 

extern "C"的慣用法

(1)在 C++中引用 C 語言中的函數(shù)和變量,在包含 C 語言頭文件(假設(shè)為 cExample.h)時,需進(jìn) 行下列處理:

 extern "C"  { #include "cExample.h"   } 

而在 C語言的頭文件中,對其外部函數(shù)只能指定為 extern 類型,C語言中不支持 extern "C"聲明, 在.c 文件中包含了 extern "C"時會出現(xiàn)編譯語法錯誤。

(2)在 C 中引用 C++語言中的函數(shù)和變量時,C++的頭文件需添加 extern "C",但是在 C 語言中不 能直接引用聲明了 extern "C"的該頭文件,應(yīng)該僅將 C 文件中將 C++中定義的extern "C"函數(shù)聲明為 extern 類型。

 

48.為什么標(biāo)準(zhǔn)頭文件都有類似以下的結(jié)構(gòu)?  

 #ifndef __INCvxWorksh    

   #define __INCvxWorksh    

    #ifdef __cplusplus   

    extern "C" {    

     #endif     /*...*/   

      #ifdef __cplusplus    

      }   

  #endif   

  #endif /* __INCvxWorksh */

顯然,頭文件中的編譯宏“#ifndef __INCvxWorksh、#define __INCvxWorksh、#endif” 的作用是防止該頭文件被重復(fù)引用。

 

49. #import跟#include的區(qū)別,@class呢?

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

 

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

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

程和線程的主要差別在于它們是不同的操作系統(tǒng)資源管理方式。

進(jìn)程有獨立的地址空間,一個進(jìn)程崩潰后,在保護(hù)模式下不會對其它進(jìn)程產(chǎn)生影響,而線程只是一個進(jìn)程中的不同執(zhí)行路徑。

線程有自己的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等于整個進(jìn)程死掉,所以多進(jìn)程的程序要比多線程的程序健壯,但在進(jìn)程切換時,耗費(fèi)資源較大,效率要差一些。但對于一些要求同時進(jìn)行并且又要共享某些變量的并發(fā)操作,只能用線程,不能用進(jìn)程。

 

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

答案:原子操作、信號量機(jī)制、自旋鎖、管程、會合、分布式系統(tǒng)

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

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

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

答案:資源競爭及進(jìn)程推進(jìn)順序非法

死鎖的4個必要條件

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

死鎖的處理

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

 

52.什么是鍵-值,鍵路徑是什么

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

鍵路徑是一個由用點作分隔符的鍵組成的字符串,用于指定一個連接在一起的對象性質(zhì)序列。第一個鍵的性質(zhì)是由先前的性質(zhì)決定的,接下來每個鍵的值也是相對于其前面的性質(zhì)。鍵路徑使您可以以獨立于模型實現(xiàn)的方式指定相關(guān)對象的性質(zhì)。通過鍵路徑,您可以指定對象圖中的一個任意深度的路徑,使其指向相關(guān)對象的特定屬性。

For example, the keypath address.streetwould get the value of the address property from thereceivingobject, and then determine the street property relative to the addressobject.

 

53.c和obj-c如何混用

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

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

3)在cpp中混用obj-c其實就是使用obj-c編寫的模塊是我們想要的。 如果模塊以類實現(xiàn),那么要按照cpp class的標(biāo)準(zhǔn)寫類的定義,頭文件中不能出現(xiàn)obj-c的東西,包括#import cocoa的。實現(xiàn)文件中,即類的實現(xiàn)代碼中可以使用obj-c的東西,可以import,只是后綴是mm。 如果模塊以函數(shù)實現(xiàn),那么頭文件要按c的格式聲明函數(shù),實現(xiàn)文件中,c++函數(shù)內(nèi)部可以用obj-c,但后綴還是mm或m。

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

 

54.目標(biāo)-動作機(jī)制

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

    動作是控件發(fā)送給目標(biāo)的消息,或者從目標(biāo)的角度看,它是目標(biāo)為了響應(yīng)動作而實現(xiàn)的方法。程序需要某些機(jī)制來進(jìn)行事件和指令的翻譯。這個機(jī)制就是目標(biāo)-動作機(jī)制。

 

55. cocoa touch框架

這些框架包括:

Core Animation

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

Core Audio

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

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

   功能列表:框架分類

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

     音頻和視頻

       CoreAudio

       OpenAL

       MediaLibrary

       AVFoundation

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

       Core Data

       SQLite

     圖形和動畫

       CoreAnimation

       OpenGL ES

       Quartz 2D

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

        Bonjour

        WebKit

        BSDSockets

      用戶應(yīng)用

        AddressBook

        CoreLocation

        MapKit

        StoreKit

 

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

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

如果您拷貝一個對象,您也擁有拷貝得到的對象,需要負(fù)責(zé)該對象的釋放。如果您保持一個對象,您就部分擁有這個對象,需要在不再使用時釋放該對象。反過來,如果您從其它對象那里接收到一個對象,則您不擁有該對象,也不應(yīng)該釋放它(這個規(guī)則有少數(shù)的例外,在參考文檔中有顯式的說明)。

 

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

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

1)ojc-c是通過一種"referring counting"(引用計數(shù))的方式來管理內(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ù)減一的時機(jī)不同而已,autorelease會在對象的使用真正結(jié)束的時候才做引用計數(shù)減一。

 

58.類工廠方法是什么?

答:類工廠方法的實現(xiàn)是為了向客戶提供方便,它們將分配和初始化合在一個步驟中,返回被創(chuàng)建的對象,并進(jìn)行自動釋放處理。這些方法的形式是+ (type)className...(其中 className不包括任何前綴)。工廠方法可能不僅僅為了方便使用。它們不但可以將分配和初始化合在一起,還可以為初始化過程提供對象的分配信息。類工廠方法的另一個目的是使類(比如NSWorkspace)提供單件實例。雖然init...方法可以確認(rèn)一 個類在每次程序運(yùn)行過程只存在一個實例,但它需要首先分配一個“生的”實例,然后還必須釋放該實例。工廠方法則可以避免為可能沒有用的對象盲目分配內(nèi)存。

 

59. 單件實例是什么?

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

 

60.動態(tài)綁定

—在運(yùn)行時確定要調(diào)用的方法

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

 

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

優(yōu)點:  

1) Cateogies   2) Posing   3) 動態(tài)識別   4) 指標(biāo)計算   5)彈性訊息傳遞   6) 不是一個過度復(fù)雜的 C 衍生語言   7) Objective-C 與 C++ 可混合編程

缺點:  

1) 不支援命名空間   2)  不支持運(yùn)算符重載  3) 不支持多重繼承  4) 使用動態(tài)運(yùn)行時類型,所有的方法都是函數(shù)調(diào)用,所以很多編譯時優(yōu)化方法都用不到。(如內(nèi)聯(lián)函數(shù)等),性能低劣。

 

62.sprintf,strcpy,memcpy使用上有什么要注意的地方?

答:strcpy是一個字符串拷貝的函數(shù),它的函數(shù)原型為strcpy(char *dst, const char *src);將src開始的一段字符串拷貝到dst開始的內(nèi)存中去,結(jié)束的標(biāo)志符號為'\0',由于拷貝的長度不是由我們自己控制的,所以這個字符串拷貝很容易出錯。

具備字符串拷貝功能的函數(shù)有memcpy,這是一個內(nèi)存拷貝函數(shù),它的函數(shù)原型為memcpy(char *dst,const char* src, unsigned int len);將長度為len的一段內(nèi)存,從src拷貝到dst中去,這個函數(shù)的長度可控。但是會有內(nèi)存疊加的問題。

sprintf是格式化函數(shù)。將一段數(shù)據(jù)通過特定的格式,格式化到一個字符串緩沖區(qū)中去。sprintf格式化的函數(shù)的長度不可控,有可能格式化后的字符串會超出緩沖區(qū)的大小,造成溢出。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    欧美成人高清在线播放| 国产午夜精品在线免费看| 午夜色午夜视频之日本| 国产精品一区二区三区欧美| 国产日韩欧美在线亚洲| 国产精品视频一区二区秋霞| 91在线播放在线播放观看| 好吊妞在线免费观看视频| 日本人妻的诱惑在线观看| 国产又大又黄又粗又免费| 中文字幕一区二区免费| 日本午夜一本久久久综合| 91精品国产综合久久福利| 麻豆看片麻豆免费视频| 欧美日韩乱码一区二区三区| 人妻少妇av中文字幕乱码高清| 日韩一区二区三区观看| 男女激情视频在线免费观看| 国产成人精品在线一区二区三区 | 亚洲国产精品一区二区| 精品人妻一区二区三区在线看 | 中文字幕一区久久综合| 欧美做爰猛烈叫床大尺度| 91精品视频全国免费| 国产精品不卡免费视频| 欧洲精品一区二区三区四区| 欧美二区视频在线观看| 日本一区二区三区黄色| 国产精品久久男人的天堂| 国产精品成人一区二区三区夜夜夜| 亚洲熟女诱惑一区二区| 国产亚洲精品一二三区| 伊人色综合久久伊人婷婷| 日木乱偷人妻中文字幕在线| 国产午夜福利一区二区| 亚洲欧美日产综合在线网| 97人摸人人澡人人人超碰| 日本加勒比不卡二三四区| 好吊色欧美一区二区三区顽频| 欧美国产精品区一区二区三区| 精品精品国产欧美在线|