久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

iOS求職之OC面試題

 love蚊子 2015-04-01

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

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

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

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

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

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

class A,,class B都引用了class C,,class D若引用class A與class B,就會(huì)報(bào)重復(fù)引用的錯(cuò)誤。

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

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

#import<> 包含iOS框架類(lèi)庫(kù)里的類(lèi),#import""包含項(xiàng)目里自定義的類(lèi),。

 

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

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

 

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

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

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

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

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

@public:共有的,,該實(shí)例變量誰(shuí)都可以訪問(wèn)。

6,、id聲明的對(duì)象有什么特性,?

  沒(méi)有 * 號(hào)

  動(dòng)態(tài)數(shù)據(jù)類(lèi)型

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

  在運(yùn)行時(shí)檢查其具體類(lèi)型

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

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

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

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

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

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

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

  現(xiàn)在執(zhí)行[A release]; [B release]; 此時(shí)創(chuàng)建對(duì)象的main函數(shù)已經(jīng)釋放了自己對(duì)對(duì)象的所有權(quán),,但是此時(shí)A和B的引用計(jì)數(shù)都還是1,,因?yàn)樗麄兓ハ嘁昧恕?/p>

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

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

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

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

意思就是說(shuō)我有個(gè)A對(duì)象,復(fù)制一份后得到A_copy對(duì)象后,,對(duì)于淺復(fù)制來(lái)說(shuō),,A和A_copy指向的是同一個(gè)內(nèi)存資源,復(fù)制的只不過(guò)是是一個(gè)指針,,對(duì)象本身資源還是只有一份,那如果我們對(duì)A_copy執(zhí)行了修改操作,那么發(fā)現(xiàn)A引用的對(duì)象同樣被修改,,這其實(shí)違背了我們復(fù)制拷貝的一個(gè)思想,。深復(fù)制就好理解了,內(nèi)存中存在了兩份獨(dú)立對(duì)象本身。

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

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

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

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

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

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

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

 

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

 

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

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

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

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

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

·       只需在此方法中返回本身對(duì)象即可,引用計(jì)數(shù)也不需要進(jìn)行改變,,因?yàn)閱卫J较碌膶?duì)象是不允許銷(xiāo)毀的,,所以也就不用保留

·       因?yàn)槿謱?shí)例不允許釋放,所以retain,release,autorelease方法均需重寫(xiě)

11,、@class的作用是什么,?

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

·       @class的作用是告訴編譯器,有這么一個(gè)類(lèi),,用吧,,沒(méi)有問(wèn)題

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

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

12、KVC是什么?KVO是什么?有什么特點(diǎn),?

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

·       KVO是鍵值觀察,,特點(diǎn)是利用鍵值觀察可以注冊(cè)成為一個(gè)對(duì)象的觀察者,,在該對(duì)象的某個(gè)屬性變化時(shí)收到通知

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

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

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

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

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

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

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

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

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

 

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

assign用于簡(jiǎn)單數(shù)據(jù)類(lèi)型,,如NSInteger,double,bool,

retain和copy用于對(duì)象,,

readwrite是可讀可寫(xiě)特性;需要生成getter方法和setter方法時(shí)

readonly是只讀特性  只會(huì)生成getter方法 不會(huì)生成setter方法 ;不希望屬性在類(lèi)外改變

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

 

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

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

 

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

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

 

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

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

遵循Cocoa Touch的使用原則;

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

 

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

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

 

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

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

 

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

Profile-> Instruments ->Time Profiler

22.Object-c的類(lèi)可以多重繼承么,?可以實(shí)現(xiàn)多個(gè)接口么,?

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

 

23.Category是什么,?重寫(xiě)一個(gè)類(lèi)的方式用繼承好還是分類(lèi)好?為什么,?

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

 

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

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

 

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

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

 

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

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

 

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

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

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

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

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

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

但是,正因?yàn)槲覀円话悴恍枰P(guān)心這個(gè)問(wèn)題,,所以因?yàn)榫庉嬈鲗?duì)數(shù)據(jù)存放做了對(duì)齊,,而我們不了解的話,常常會(huì)對(duì)一些問(wèn)題感到迷惑,。最常見(jiàn)的就是struct數(shù)據(jù)結(jié)構(gòu)的sizeof結(jié)果,,出乎意料。

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

       可通過(guò)編譯器命令來(lái)設(shè)定:

      #progma pack (2)   

 

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

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

功能:讓編譯器自動(dòng)編寫(xiě)一對(duì)與數(shù)據(jù)成員同名的方法聲明來(lái)省去讀寫(xiě)方法的聲明。

聲明property的語(yǔ)法為:

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

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

 

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

讀寫(xiě)屬性: (readwrite/readonly)

setter語(yǔ)意:(assign/retain/copy)

原子性: (atomicity/nonatomic)

 

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

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

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

 

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

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

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

 

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

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

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

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

 

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

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

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

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

FTP文件傳輸協(xié)議是TCP/IP網(wǎng)絡(luò)上兩臺(tái)計(jì)算機(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àn)維網(wǎng)(world wide web)交換信息的基礎(chǔ)。

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

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

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

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

TFTP(Trivial FileTransfer Protocol,簡(jiǎn)單文件傳輸協(xié)議)是TCP/IP協(xié)議族中的一個(gè)用來(lái)在客戶(hù)機(jī)與服務(wù)器之間進(jìn)行簡(jiǎn)單文件傳輸?shù)膮f(xié)議,,提供不復(fù)雜、開(kāi)銷(xiāo)不大的文件傳輸服務(wù),。端口號(hào)為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說(shuō)明(specified)。

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

 

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

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

 

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

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

 

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

 

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

 

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

 

 

32、聲明@property的語(yǔ)法中,,retain,、copy、assign的含義及作用,?試寫(xiě)出 @property中帶retain和assign關(guān)鍵字,通過(guò)@synthesize自動(dòng)生成的的合成存取方法(set,、get方法)的實(shí)現(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ī)制,,并作簡(jiǎn)單的比較,。

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

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

 

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

 

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

 

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

 

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

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

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

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

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

#異常的處理

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

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

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

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

 

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

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

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

 

35,、JSON中{ }代表_____,,[ ]代表_____,試將下面的JSON串用OC對(duì)象表示出來(lái):

{ "people": [

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

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

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

],,

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

}

 

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

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

//

@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對(duì)象

@property(nonatomic, copy) NSString* strLocation;

 

@end

 

36.  Object-C有多繼承嗎,?沒(méi)有的話用什么代替?

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

 

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

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

在類(lèi)里面聲名一個(gè)私有方法?@interface Controller : NSObject

{ NSString *something;

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

(private)

-(void)thisIsAPrivateMethod;?@end

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

 

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

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

申請(qǐng)大小:棧:棧是向低地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),,是一塊連續(xù)的內(nèi)存的區(qū)域

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

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

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

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

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

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

 

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

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

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

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

 

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

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

 

42. 類(lèi)別的作用,?

答:有時(shí)我們需要在一個(gè)已經(jīng)定義好的類(lèi)中增加一些方法,而不想去重寫(xiě)該類(lèi),??梢允褂妙?lèi)別對(duì)該類(lèi)擴(kuò)充新的方法。

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

   代理的作用

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

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

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

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

 

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

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

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

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

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

從內(nèi)存存儲(chǔ)來(lái)看

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

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

 

從上面的比較可以看出,,如果需要快速訪問(wèn)數(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)會(huì)認(rèn)為加一個(gè)a數(shù)組的偏移,,是偏移了一個(gè)數(shù)組的大?。ū纠?個(gè)int)   

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

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

   而指針加1要根據(jù)指針類(lèi)型加上一定的值,,不同類(lèi)型的指針+1之后增加的大小不同,。  

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

   但是prt與(&a+1)類(lèi)型是不一樣的(這點(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].

 

45. 寫(xiě)一個(gè)委托的interface

@protocol MyDelegate;

@interface MyClass: NSObject

{    id <MyDelegate> delegate; }

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

@end

 

46. 寫(xiě)一個(gè)NSString類(lèi)的實(shí)現(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有什么含意,?修飾類(lèi)呢?static的作用,用于類(lèi)呢?還有extern c的作用

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ù)的常指針(也就是說(shuō),指針指向的整型數(shù)是可以修改的,,但指針是不可修改的),。最后一個(gè)意味著a是一個(gè)指向常整型數(shù)的常指針(也就是說(shuō),指針指向的整型數(shù)是不可修改的,,同時(shí)指針也是不可修改的),。

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

(1)欲阻止一個(gè)變量被改變,,可以使用 const 關(guān)鍵字。在定義該 const 變量時(shí),,通常需要對(duì)它進(jìn)行初 始化,,因?yàn)橐院缶蜎](méi)有機(jī)會(huì)再去改變它了;(2)對(duì)指針來(lái)說(shuō),,可以指定指針本身為 const,,也可以指定指針?biāo)傅臄?shù)據(jù)為 const,,或二者同時(shí)指 定為 const;

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

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

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

· ; 一個(gè)中斷服務(wù)子程序中會(huì)訪問(wèn)到的非自動(dòng)變量(Non-automatic variables)

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

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

· ; 一個(gè)指針可以是volatile 嗎?解釋為什么,。 

下面是答案: 

· ; 是的,。一個(gè)例子是只讀的狀態(tài)寄存器。它是volatile因?yàn)樗赡鼙灰庀氩坏降馗淖?。它是const因?yàn)槌绦虿粦?yīng)該試圖去修改它,。 

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

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

(1)函數(shù)體內(nèi) static 變量的作用范圍為該函數(shù)體,不同于 auto 變量,,該變量的內(nèi)存只被分配一次,,因此其值在下次調(diào)用時(shí)仍維持上次的值; (2)在模塊內(nèi)的 static 全局變量可以被模塊內(nèi)所用函數(shù)訪問(wèn),,但不能被模塊外其它函數(shù)訪問(wèn),;

(3)在模塊內(nèi)的 static 函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用,這個(gè)函數(shù)的使用范圍被限制在聲明 它的模塊內(nèi),;

(4)在類(lèi)中的 static 成員變量屬于整個(gè)類(lèi)所擁有,,對(duì)類(lèi)的所有對(duì)象只有一份拷貝,;

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

 

extern "C"的作用:

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

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

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

 

extern "C"的慣用法

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

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

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

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

 

48.為什么標(biāo)準(zhǔn)頭文件都有類(lèi)似以下的結(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一般用于頭文件中需要聲明該類(lèi)的某個(gè)實(shí)例變量的時(shí)候用到,,在m文件中還是需要使用#import而#import比起#include的好處就是不會(huì)引起交叉編譯。

 

50.線程與進(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í)行路徑,。

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

 

51.列舉幾種進(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)路

死鎖的處理

答案:鴕鳥(niǎo)策略,、預(yù)防策略,、避免策略、檢測(cè)與解除死鎖

 

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

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

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

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的文件時(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不是問(wèn)題

3)在cpp中混用obj-c其實(shí)就是使用obj-c編寫(xiě)的模塊是我們想要的。 如果模塊以類(lèi)實(shí)現(xiàn),,那么要按照cpp class的標(biāo)準(zhǔn)寫(xiě)類(lèi)的定義,,頭文件中不能出現(xiàn)obj-c的東西,,包括#import cocoa的。實(shí)現(xiàn)文件中,,即類(lèi)的實(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.

 

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

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

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

 

55. cocoa touch框架

這些框架包括:

Core Animation

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

Core Audio

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

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

   功能列表:框架分類(lèi)

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

     音頻和視頻

       CoreAudio

       OpenAL

       MediaLibrary

       AVFoundation

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

       Core Data

       SQLite

     圖形和動(dòng)畫(huà)

       CoreAnimation

       OpenGL ES

       Quartz 2D

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

        Bonjour

        WebKit

        BSDSockets

      用戶(hù)應(yīng)用

        AddressBook

        CoreLocation

        MapKit

        StoreKit

 

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

答:如果您通過(guò)分配和初始化(比如[[MyClass alloc] init])的方式來(lái)創(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ì)象,。反過(guò)來(lái),如果您從其它對(duì)象那里接收到一個(gè)對(duì)象,,則您不擁有該對(duì)象,,也不應(yīng)該釋放它(這個(gè)規(guī)則有少數(shù)的例外,在參考文檔中有顯式的說(shuō)明),。

 

57.自動(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是通過(guò)一種"referring counting"(引用計(jì)數(shù))的方式來(lái)管理內(nèi)存的, 對(duì)象在開(kāi)始分配內(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)銷(xiāo)毀.

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

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

 

58.類(lèi)工廠方法是什么?

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

 

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

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

 

60.動(dòng)態(tài)綁定

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

動(dòng)態(tài)綁定將調(diào)用方法的確定也推遲到運(yùn)行時(shí),。在編譯時(shí),,方法的調(diào)用并不和代碼綁定在一起,只有在消實(shí)發(fā)送出來(lái)之后,,才確定被調(diào)用的代碼,。通過(guò)動(dòng)態(tài)類(lè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)類(lèi)型確定了的對(duì)象發(fā)送消息時(shí),,運(yùn)行環(huán)境系統(tǒng)會(huì)通過(guò)接收者的isa指針定位對(duì)象的類(lèi),,并以此為起點(diǎn)確定被調(diào)用的方法,方法和消息是動(dòng)態(tài)綁定的,。而且,,您不必在Objective-C 代碼中做任何工作,就可以自動(dòng)獲取動(dòng)態(tài)綁定的好處,。您在每次發(fā)送消息時(shí),,特別是當(dāng)消息的接收者是動(dòng)態(tài)類(lèi)型已經(jīng)確定的對(duì)象時(shí),動(dòng)態(tài)綁定就會(huì)例行而透明地發(fā)生,。

 

61.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è)過(guò)度復(fù)雜的 C 衍生語(yǔ)言   7) Objective-C 與 C++ 可混合編程

缺點(diǎn):  

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

 

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

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

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

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

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

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多