1阁最、Objective-C的類可以多重繼承么?可以采用多個(gè)協(xié)議么弥臼?
答:不可以多重繼承,可以采用多個(gè)協(xié)議根灯。
2径缅、#import和#include的區(qū)別是什么?#import<> 跟 #import""有什么區(qū)別烙肺?
#import能避免頭文件被重復(fù)包含的問題:
1) 一般來說纳猪,導(dǎo)入objective c的頭文件時(shí)用#import,包含c/c++頭文件時(shí)用#include桃笙。
使用include要注意重復(fù)引用的問題:
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)問題。
所以熏瞄,#import比起#include的好處就是它避免了重復(fù)引用的問題脚祟。所以在OC中我們基本用的都是import。
#import<> 包含iOS框架類庫(kù)里的類强饮,#import""包含項(xiàng)目里自定義的類由桌。
3、Category是什么邮丰?擴(kuò)展一個(gè)類的方式用繼承好還是類目好行您?為什么?
答:Category是類目剪廉。用類目好娃循,因?yàn)槔^承要滿足a is a b的關(guān)系,而類目只需要滿足a has a b的關(guān)系斗蒋,局限性更小捌斧,你不用定義子類就能擴(kuò)展一個(gè)類的功能,還能將類的定義分開放在不同的源文件里, 用Category去重寫類的方法泉沾,僅對(duì)本Category有效捞蚂,不會(huì)影響到其他類與原有類的關(guān)系。
4跷究、延展是什么姓迅?作用是什么?
答:延展(extension):在自己類的實(shí)現(xiàn)文件中添加類目來聲明私有方法。
5丁存、類實(shí)例(成員)變量的@protected,@private,@public聲明各有什么含義肩杈?
@protected:受保護(hù)的,該實(shí)例變量只能在該類和其子類內(nèi)訪問解寝,其他類內(nèi)不能訪問扩然。
@private:私有的,該實(shí)例變量只能在該類內(nèi)訪問编丘,其他類內(nèi)不能訪問。
@public:共有的彤悔,該實(shí)例變量誰都可以訪問嘉抓。
6、id聲明的對(duì)象有什么特性晕窑?
? 沒有 * 號(hào)
? 動(dòng)態(tài)數(shù)據(jù)類型
? 可以指向任何類的對(duì)象(設(shè)置是nil)抑片,而不關(guān)心其具體類型
? 在運(yùn)行時(shí)檢查其具體類型
? 可以對(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)引用的問題這樣理解:
比如在main函數(shù)中創(chuàng)建了兩個(gè)類的對(duì)象A和B焰枢,現(xiàn)在引用計(jì)數(shù)都是1。現(xiàn)在讓A和B互相引用(A有一個(gè)屬性是B對(duì)象舌剂,屬性說明是retain济锄;B有一個(gè)屬性是A對(duì)象,屬性說明是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將無法釋放,因?yàn)橐脶尫臕必須先釋放B岩喷,在B的dealloc方法中再釋放A委造。同理,要想釋放B必須先釋放A均驶,在A的dealloc方法中再釋放B昏兆。所以這兩個(gè)對(duì)象將一直存在在內(nèi)存中而不釋放。這就是所謂的循環(huán)引用的問題。要想解決這個(gè)問題爬虱,一般的方法可以將引用的屬性設(shè)置為assign,而不是retain來處理隶债。
8、淺拷貝和深拷貝區(qū)別是什么跑筝?
淺層復(fù)制:只復(fù)制指向?qū)ο蟮闹羔標蓝铮粡?fù)制引用對(duì)象本身。
深層復(fù)制:復(fù)制引用對(duì)象本身曲梗。
意思就是說我有個(gè)A對(duì)象赞警,復(fù)制一份后得到A_copy對(duì)象后,對(duì)于淺復(fù)制來說虏两,A和A_copy指向的是同一個(gè)內(nèi)存資源愧旦,復(fù)制的只不過是是一個(gè)指針,對(duì)象本身資源還是只有一份定罢,那如果我們對(duì)A_copy執(zhí)行了修改操作,那么發(fā)現(xiàn)A引用的對(duì)象同樣被修改笤虫,這其實(shí)違背了我們復(fù)制拷貝的一個(gè)思想。深復(fù)制就好理解了,內(nèi)存中存在了兩份獨(dú)立對(duì)象本身祖凫。
用網(wǎng)上一哥們通俗的話將就是:
淺復(fù)制好比你和你的影子琼蚯,你完蛋,你的影子也完蛋
深復(fù)制好比你和你的克隆人惠况,你完蛋遭庶,你的克隆人還活著。
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í)被銷毀。
- 如果通過其他方法獲取一個(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è)單例模式的類,給出思路宝惰,不寫代碼植榕。
- 首先必須創(chuàng)建一個(gè)全局實(shí)例,通常存放在一個(gè)全局變量中,此全局變量設(shè)置為nil
- 提供工廠方法對(duì)該全局實(shí)例進(jìn)行訪問掌测,檢查該變量是否為nil内贮,如果nil就創(chuàng)建一個(gè)新的實(shí)例产园,最后返回全局實(shí)例
- 全局變量的初始化在第一次調(diào)用工廠方法時(shí)會(huì)在+allocWithZone:中進(jìn)行汞斧,所以需要重寫該方法,防止通過標(biāo)準(zhǔn)的alloc方式創(chuàng)建新的實(shí)例
- 為了防止通過copy方法得到新的實(shí)例什燕,需要實(shí)現(xiàn)-copyWithZone方法
- 只需在此方法中返回本身對(duì)象即可粘勒,引用計(jì)數(shù)也不需要進(jìn)行改變,因?yàn)閱卫J较碌膶?duì)象是不允許銷毀的屎即,所以也就不用保留
- 因?yàn)槿謱?shí)例不允許釋放庙睡,所以retain,release,autorelease方法均需重寫
11、@class的作用是什么技俐?
答:在頭文件中乘陪, 一般只需要知道被引用的類的名稱就可以了。 不需要知道其內(nèi)部的實(shí)體變量和方法雕擂,所以在頭文件中一般使用@class來聲明這個(gè)名稱是類的名稱啡邑。 而在實(shí)現(xiàn)類里面,因?yàn)闀?huì)用到這個(gè)引用類的內(nèi)部的實(shí)體變量和方法井赌,所以需要使用#import來包含這個(gè)被引用類的頭文件谤逼。
- @class的作用是告訴編譯器,有這么一個(gè)類仇穗,用吧流部,沒有問題
- @class還可以解決循環(huán)依賴的問題,例如A.h導(dǎo)入了B.h纹坐,而B.h導(dǎo)入了A.h枝冀,每一個(gè)頭文件的編譯都要讓對(duì)象先編譯成功才行
- 使用@class就可以避免這種情況的發(fā)生
12、KVC是什么?KVO是什么?有什么特點(diǎn)?
- KVC是鍵值編碼宾茂,特點(diǎn)是通過指定表示要訪問的屬性名字的字符串標(biāo)識(shí)符瓷马,可以進(jìn)行類的屬性讀取和設(shè)置
- KVO是鍵值觀察,特點(diǎn)是利用鍵值觀察可以注冊(cè)成為一個(gè)對(duì)象的觀察者跨晴,在該對(duì)象的某個(gè)屬性變化時(shí)收到通知
13欧聘、MVC是什么?有什么特性端盆?
- MVC是一種設(shè)計(jì)模式怀骤,由模型、視圖焕妙、控制器3部分組成蒋伦。
- 模型:保存應(yīng)用程序數(shù)據(jù)的類,處理業(yè)務(wù)邏輯的類
- 視圖:窗口焚鹊,控件和其他用戶能看到的并且能交互的元素
- 控制器:將模型和試圖綁定在一起痕届,確定如何處理用戶輸入的類
14、定義屬性時(shí)末患,什么情況使用copy研叫、assign、retain璧针?
使用assign: 對(duì)基礎(chǔ)數(shù)據(jù)類型 (NSInteger嚷炉,CGFloat)和C數(shù)據(jù)類型(int, float,double, char, 等等)
使用copy: 希望獲得源對(duì)象的副本而不改變?cè)磳?duì)象內(nèi)容時(shí),對(duì)NSString
使用retain: 希望獲得源對(duì)象的所有權(quán)時(shí)探橱,對(duì)其他NSObject和其子類
15申屹、屬性readwrite,readonly隧膏,assign哗讥,retain,copy胞枕,nonatomic 各是什么作用杆煞,在那種情況下用?
assign用于簡(jiǎn)單數(shù)據(jù)類型曲稼,如NSInteger,double,bool,
retain和copy用于對(duì)象索绪,
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非原子操作,決定編譯器生成的setter getter是否是原子操作盏阶,atomic表示多線程安全晒奕,一般使用nonatomic
16、id 聲明的對(duì)象有什么特性名斟?
答:Id聲明的對(duì)象具有運(yùn)行時(shí)的特性脑慧,即可以指向任意類型的objcetive-c的對(duì)象;
17砰盐、Objective-C如何對(duì)內(nèi)存管理的,說說你的看法和解決方法?
答:Objective-C的內(nèi)存管理主要有三種方式ARC(自動(dòng)內(nèi)存計(jì)數(shù))闷袒、手動(dòng)內(nèi)存計(jì)數(shù)、內(nèi)存池岩梳。
18囊骤、內(nèi)存管理的幾條原則時(shí)什么?
誰申請(qǐng)冀值,誰釋放
遵循Cocoa Touch的使用原則也物;
內(nèi)存管理主要要避免“過早釋放”和“內(nèi)存泄漏”,對(duì)于“過早釋放”需要注意@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的類可以多重繼承么胰舆?可以實(shí)現(xiàn)多個(gè)接口么?
答:Object-c的類不可以多重繼承蹬挤;可以實(shí)現(xiàn)多個(gè)接口缚窿,通過實(shí)現(xiàn)多個(gè)接口可以完成C++的多重繼承;
23焰扳、Category是什么倦零?重寫一個(gè)類的方式用繼承好還是分類好误续?為什么?
答:Category是類別扫茅,一般情況用分類好蹋嵌,用Category去重寫類的方法,僅對(duì)本Category有效葫隙,不會(huì)影響到其他類與原有類的關(guān)系栽烂。
24、描述一下iOS SDK中如何實(shí)現(xiàn)MVC的開發(fā)模式
MVC是模型恋脚、試圖愕鼓、控制開發(fā)模式,對(duì)于iOS SDK慧起,所有的View都是視圖層的菇晃,它應(yīng)該獨(dú)立于模型層,由視圖控制層來控制蚓挤。所有的用戶數(shù)據(jù)都是模型層磺送,它應(yīng)該獨(dú)立于視圖。所有的ViewController都是控制層灿意,由它負(fù)責(zé)控制視圖估灿,訪問模型數(shù)據(jù)
25、Object C中創(chuàng)建線程的方法是什么缤剧?如果在主線程中執(zhí)行代碼馅袁,方法是什么?如果想延時(shí)執(zhí)行代碼荒辕、方法又是什么汗销?
線程創(chuàng)建有三種方法:使用NSThread創(chuàng)建、使用 GCD的dispatch抵窒、使用子類化的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 瘾杭?
該問題涉及編譯器的“內(nèi)存對(duì)齊”問題:
現(xiàn)代計(jì)算機(jī)中內(nèi)存空間都是按照byte(字節(jié))劃分的,從理論上講似乎對(duì)任何類型的變量的訪問可以從任何地址開始捍岳,但實(shí)際情況是在訪問特定變量的時(shí)候經(jīng)常在特定的內(nèi)存地址訪問富寿,這就需要各類型數(shù)據(jù)按照一定的規(guī)則在空間上排列睬隶,而不是順序的一個(gè)接一個(gè)的排放,這就是對(duì)齊页徐。
對(duì)齊的作用和原因:各個(gè)硬件平臺(tái)對(duì)存儲(chǔ)空間的處理上有很大的不同苏潜。一些平臺(tái)對(duì)某些特定類型的數(shù)據(jù)只能從某些特定地址開始存取。其他平臺(tái)可能沒有這種情況变勇, 但是最常見的是如果不按照適合其平臺(tái)的要求對(duì)數(shù)據(jù)存放進(jìn)行對(duì)齊恤左,會(huì)在存取效率上帶來?yè)p失。比如有些平臺(tái)每次讀都是從偶地址開始搀绣,如果一個(gè)int型(假設(shè)為 32位)如果存放在偶地址開始的地方飞袋,那么一個(gè)讀周期就可以讀出,而如果存放在奇地址開始的地方链患,就可能會(huì)需要2個(gè)讀周期巧鸭,并對(duì)兩次讀出的結(jié)果的高低 字節(jié)進(jìn)行拼湊才能得到該int數(shù)據(jù)。顯然在讀取效率上下降很多麻捻。這也是空間和時(shí)間的博弈纲仍。
通常,我們寫程序的時(shí)候贸毕,不需要考慮對(duì)齊問題郑叠。編譯器會(huì)替我們選擇適合目標(biāo)平臺(tái)的對(duì)齊策略。當(dāng)然明棍,我們也可以通知給編譯器傳遞預(yù)編譯指令而改變對(duì)指定數(shù)據(jù)的對(duì)齊方法乡革。
但是,正因?yàn)槲覀円话悴恍枰P(guān)心這個(gè)問題摊腋,所以因?yàn)榫庉嬈鲗?duì)數(shù)據(jù)存放做了對(duì)齊沸版,而我們不了解的話,常常會(huì)對(duì)一些問題感到迷惑歌豺。最常見的就是struct數(shù)據(jù)結(jié)構(gòu)的sizeof結(jié)果推穷,出乎意料心包。
對(duì)于結(jié)構(gòu)體來說类咧,按成員中所占字節(jié)最大的是float類型,占用4個(gè)字節(jié)蟹腾,一共有3個(gè)成員痕惋,所以總的占用字節(jié)為:4 * 3 = 12.
可通過編譯器命令來設(shè)定:
#progma pack (2)
28、@property語法中readonly/readwrite娃殖,atomic/nonatomic的作用值戳,@dynamic的作用?
其中參數(shù)主要分為三類:
讀寫屬性: (readwrite/readonly)
setter語意:(assign/retain/copy)
原子性: (atomicity/nonatomic)
各參數(shù)意義如下:
readwrite:同時(shí)產(chǎn)生setter\getter方法
readonly:只產(chǎn)生簡(jiǎn)單的getter,沒有setter炉爆。
assign:默認(rèn)類型,setter方法直接賦值堕虹,而不進(jìn)行retain操作
retain:setter方法對(duì)參數(shù)進(jìn)行release舊值卧晓,再retain新值。
copy:setter方法進(jìn)行Copy操作赴捞,與retain一樣
atomic:原子性逼裆,它沒有一個(gè)如果你沒有對(duì)原子性進(jìn)行一個(gè)聲明(atomic or nonatomic),那么系統(tǒng)會(huì)默認(rèn)你選擇的是atomic赦政。
原子性就是說一個(gè)操作不可以被中途cpu暫停然后調(diào)度, 即不能被中斷, 要不就執(zhí)行完, 要不就不執(zhí)行. 如果一個(gè)操作是原子性的,那么在多線程環(huán)境下, 就不會(huì)出現(xiàn)變量被修改等奇怪的問題胜宇。原子操作就是不可再分的操作,在多線程程序中原子操作是一個(gè)非常重要的概念恢着,它常常用來實(shí)現(xiàn)一些同步機(jī)制桐愉,同時(shí)也是一些常見的多線程Bug的源頭。當(dāng)然掰派,原子性的變量在執(zhí)行效率上要低些从诲。
關(guān)于異步與同步:并非同步就是不好,我們通常需要同時(shí)進(jìn)行多個(gè)操作靡羡,這時(shí)使用異步盏求,而對(duì)于程序來說,一般就是使用多線程亿眠,然而我們很多時(shí)候需要在多個(gè)線程間訪問共享的數(shù)據(jù)碎罚,這個(gè)時(shí)候又需要同步來保證數(shù)據(jù)的準(zhǔn)確性或訪問的先后次序。當(dāng)有多個(gè)線程需要訪問到同一個(gè)數(shù)據(jù)時(shí)纳像,OC中荆烈,我們可以使用@synchronized(變量)來對(duì)該變量進(jìn)行加鎖(加鎖的目的常常是為了同步或保證原子操作)。
nonatomic:非原子性竟趾,是直接從內(nèi)存中取數(shù)值憔购,因?yàn)樗菑膬?nèi)存中取得數(shù)據(jù),它并沒有一個(gè)加鎖的保護(hù)來用于cpu中的寄存器計(jì)算Value岔帽,它只是單純的從內(nèi)存地址中玫鸟,當(dāng)前的內(nèi)存存儲(chǔ)的數(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ì)算機(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ǎng)(world wide web)交換信息的基礎(chǔ)纫骑。
SMTP(Simple MailTransfer Protocol)即簡(jiǎn)單郵件傳輸協(xié)議,它是一組用于由源地址到目的地址傳送郵件的規(guī)則蝎亚,由它來控制信件的中轉(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) 的縮寫煤墙,是因特網(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)仿野,用來對(duì)通信線路進(jìn)行管理铣减。
TFTP(Trivial FileTransfer Protocol,簡(jiǎn)單文件傳輸協(xié)議)是TCP/IP協(xié)議族中的一個(gè)用來在客戶機(jī)與服務(wù)器之間進(jìn)行簡(jiǎn)單文件傳輸?shù)膮f(xié)議,提供不復(fù)雜脚作、開銷不大的文件傳輸服務(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說明(specified)从祝。
UDP 是User DatagramProtocol的簡(jiǎn)稱襟己, 中文名是用戶數(shù)據(jù)包協(xié)議,是OSI 參考模型中一種無連接的傳輸層協(xié)議哄褒,提供面向事務(wù)的簡(jiǎn)單不可靠信息傳送服務(wù)稀蟋,IETF RFC 768是UDP的正式規(guī)范。
面向連接:是指通信雙方在通信時(shí)呐赡,要事先建立一條通信線路,其有三個(gè)過程:建立連接骏融、使用連接和釋放連接链嘀。電話系統(tǒng)是一個(gè)面向連接的模式萌狂,撥號(hào)、通話怀泊、掛機(jī)茫藏;TCP協(xié)議就是一種面向連接的協(xié)議。
面向無連接:是指通信雙方不需要事先建立一條通信線路霹琼,而是把每個(gè)帶有目的地址的包(報(bào)文分組)送到線路上务傲,由系統(tǒng)自主選定路線進(jìn)行傳輸。郵政系統(tǒng)是一個(gè)無連接的模式枣申,天羅地網(wǎng)式的選擇路線售葡,天女散花式的傳播形式;IP忠藤、UDP協(xié)議就是一種無連接協(xié)議挟伙。
31、簡(jiǎn)述MVC模式中M模孩、V尖阔、C分別指代什么及發(fā)揮的作用?
MVC開始是存在于Desktop(桌面)程序中的榨咐,M是指數(shù)據(jù)模型介却,V是指用戶界面,C則是控制器块茁,使用MVC的目的是將M和V的實(shí)現(xiàn)代碼分離筷笨。C存在的目的則是確保M和V的同步,一旦M改變龟劲,V應(yīng)該同步更新胃夏。
視圖是用戶看到并與之交互的界面,視圖沒有真正的處理發(fā)生昌跌,不管這些數(shù)據(jù)是聯(lián)機(jī)存儲(chǔ)的還是一個(gè)雇員列表仰禀,作為視圖來講,它只是作為一種輸出數(shù)據(jù)并允許用戶操縱的方式蚕愤。
模型表示企業(yè)數(shù)據(jù)和業(yè)務(wù)規(guī)則答恶,模型返回的數(shù)據(jù)是中立的,就是說模型與數(shù)據(jù)格式無關(guān)萍诱,這樣一個(gè)模型能為多個(gè)視圖提供數(shù)據(jù)悬嗓,由于應(yīng)用于模型的代碼只需寫一次就可以被多個(gè)視圖重用,所以減少了代碼的重復(fù)性裕坊。
控制器接受用戶的輸入并調(diào)用模型和視圖去完成用戶的需求包竹,控制器本身不輸出任何東西和做任何處理。它只是接收請(qǐng)求并決定調(diào)用哪個(gè)模型構(gòu)件去處理請(qǐng)求,然后再確定用哪個(gè)視圖來顯示返回的數(shù)據(jù)周瞎。
32苗缩、聲明@property的語法中,retain声诸、copy酱讶、assign的含義及作用?試寫出 @property中帶retain和assign關(guān)鍵字彼乌,通過@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ì)象來處理所有事件時(shí)榛泛。委托機(jī)制依賴于某個(gè)協(xié)議定義的方法來發(fā)送消息。
3)通告機(jī)制:當(dāng)需要多個(gè)對(duì)象或兩個(gè)無關(guān)對(duì)象處理同一個(gè)事件時(shí)噩斟。
4)Block:適用于回調(diào)只發(fā)生一次的簡(jiǎn)單任務(wù)曹锨。
34、列出在編碼中哪些編碼習(xí)慣有助于提高代碼質(zhì)量剃允、軟件性能和健壯性沛简,減少程序崩潰。
#使用嚴(yán)格的命名規(guī)則(如匈牙利命名法)能夠避免不必要的類型轉(zhuǎn)換錯(cuò)誤斥废。
#在編碼前先設(shè)計(jì)好流程圖或使用偽代碼椒楣,清晰化整個(gè)設(shè)計(jì)意圖。
#對(duì)自己的代碼進(jìn)行嚴(yán)格的單元測(cè)試(unit testing)牡肉。
單元測(cè)試是指對(duì)軟件中的最小可測(cè)試單元進(jìn)行檢查和驗(yàn)證捧灰。
如C語言中單元指一個(gè)函數(shù),Java里單元指一個(gè)類统锤,圖形化的軟件中可以指一個(gè)窗口或一個(gè)菜單等毛俏。
總的來說,單元就是人為規(guī)定的最小的被測(cè)功能模塊饲窿。
單元測(cè)試是在軟件開發(fā)過程中要進(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)聚性的類徒仓。
你應(yīng)該經(jīng)常評(píng)估代碼質(zhì)量,并不時(shí)的進(jìn)行許多小調(diào)整誊垢,而不是一次修改許多東西掉弛。在寫了幾行代碼之后,就應(yīng)該進(jìn)行一次構(gòu)建/測(cè)試喂走。
在沒有得到反饋時(shí)殃饿,你不要走的太遠(yuǎn)。
#使用工具(如Instrument)來幫助檢查內(nèi)存泄漏芋肠、過早釋放內(nèi)存乎芳、CPU使用效率等問題。
#消除所有的編譯警告帖池,警告就是錯(cuò)誤奈惑。
#寫防御性的代碼,使用內(nèi)省的方法檢查傳入的參數(shù)睡汹。
35肴甸、JSON中{ }代表_____,[ ]代表_____囚巴,試將下面的JSON串用OC對(duì)象表示出來:
{ "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ù)組彤叉,與其他語言中的數(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對(duì)象
@property(nonatomic, copy) NSString* strLocation;
@end
36、Object-C有多繼承嗎秽浇?沒有的話用什么代替浮庐?
答:沒有,cocoa 中所有的類都是NSObject 的子類兼呵,多繼承在這里是用protocol 委托代理來實(shí)現(xiàn)的
兔辅,
ood的多態(tài)特性在obj-c中通過委托來實(shí)現(xiàn)。
37.object-C有私有方法嗎击喂?私有變量呢维苔?
objective-c – 類里面的方法只有兩種, 靜態(tài)方法和實(shí)例方法.
在類里面聲名一個(gè)私有方法
@interface Controller : NSObject {
NSString *something;
}
+ (void)thisIsAStaticMethod;
– (void)thisIsAnInstanceMethod;
@end
@interface Controller (private)
-(void)thisIsAPrivateMethod;
@end
@private可以用來修飾私有變量
在Objective‐C中,所有實(shí)例變量默認(rèn)都是私有的懂昂,所有實(shí)例方法默認(rèn)都是公有的
38. 堆和棧的區(qū)別介时?
> 管理方式:
- 對(duì)于棧來講,是由編譯器自動(dòng)管理,無需我們手工控制沸柔;
- 對(duì)于堆來說循衰,釋放工作由程序員控制,容易產(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)行釋放俭正,無需我們手工實(shí)現(xiàn)
39奸鬓、kvc和kvo的區(qū)別?
kvc:鍵值編碼掸读,是一種間接訪問對(duì)象的屬性串远,使用字符串來標(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一般用于頭文件中需要聲明該類的某個(gè)實(shí)例變量的時(shí)候用到避归,在m文件中還是需要使用#import
而#import比起#include的好處就是不會(huì)引起重復(fù)包含荣月。
42、類別的作用梳毙?
答:有時(shí)我們需要在一個(gè)已經(jīng)定義好的類中增加一些方法哺窄,而不想去重寫該類≌饲拢可以使用類別對(duì)該類擴(kuò)充新的方法萌业。
注意:類別只能擴(kuò)充方法,而不能擴(kuò)充成員變量奸柬。
代理的作用
委托代理(degegate)生年,目的是改變和傳遞控制鏈
顧名思義,把某個(gè)對(duì)象要做的事情委托給別的對(duì)象去做廓奕。那么別的對(duì)象就是這個(gè)對(duì)象的代理抱婉,代替它來打理要做的事档叔。反映到程序中,首先要明確一個(gè)對(duì)象的委托方是哪個(gè)對(duì)象蒸绩,委托所做的內(nèi)容是什么衙四。
委托機(jī)制是一種設(shè)計(jì)模式。
多態(tài):子類的指針可以賦值給父類
43.鏈表和數(shù)組的區(qū)別在哪里?
二者都屬于一種數(shù)據(jù)結(jié)構(gòu)
從邏輯結(jié)構(gòu)來看
- 數(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)直接存取漱抓。
- 鏈表動(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ǔ)來看
- (靜態(tài))數(shù)組從棧中分配空間, 對(duì)于程序員方便快速,但是自由度小
- 鏈表從堆中分配空間, 自由度大但是申請(qǐng)管理比較麻煩
從上面的比較可以看出士骤,如果需要快速訪問數(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ù)組的大小(本例是5個(gè)int)
int *ptr=(int *)(&a+1);則ptr實(shí)際是&(a[5]),也就是a+5
原因如下:&a是數(shù)組指針又固,其類型為 int (*)[5];
而指針加1要根據(jù)指針類型加上一定的值仲器,不同類型的指針+1之后增加的大小不同⊙龉冢
a是長(zhǎng)度為5的int數(shù)組指針乏冀,所以要加 5*sizeof(int),所以ptr實(shí)際是a[5]沪停,
但是prt與(&a+1)類型是不一樣的(這點(diǎn)很重要)煤辨,所以prt-1只會(huì)減去sizeof(int*)
a,&a的地址是一樣的裳涛,但意思不一樣
a是數(shù)組首地址,也就是a[0]的地址众辨,&a是對(duì)象(數(shù)組)首地址端三,
a+1是數(shù)組下一元素的地址,即a[1],&a+1是下一個(gè)對(duì)象的地址鹃彻,即a[5].
45郊闯、寫一個(gè)委托的interface
@protocol MyDelegate;
@interface MyClass: NSObject {
id <MyDelegate> delegate;
}
//委托方法@protocol MyDelegate- (void)didJobs:(NSArray *)args;
@end
46、寫一個(gè)NSString類的實(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有什么含意团赁?修飾類呢?static的作用,用于類呢?還有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ù)的常指針(也就是說害捕,指針指向的整型數(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ù)渐苏,防止其被無意的代碼修改掀潮。簡(jiǎn)而言之,這樣可以減少bug的出現(xiàn)琼富。
(1)欲阻止一個(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 類型斥滤,以使得其返回值不為“左值”将鸵。
static關(guān)鍵字的作用:
(1)函數(shù)體內(nèi) static 變量的作用范圍為該函數(shù)體,不同于 auto 變量佑颇,該變量的內(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)在類中的 static 成員變量屬于整個(gè)類所擁有,對(duì)類的所有對(duì)象只有一份拷貝移袍;
(5)在類中的 static 成員函數(shù)屬于整個(gè)類所擁有解藻,這個(gè)函數(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)時(shí)钳吟,需進(jìn) 行下列處理:
extern "C" { #include "cExample.h" }
而在 C語言的頭文件中,對(duì)其外部函數(shù)只能指定為 extern 類型窘拯,C語言中不支持 extern "C"聲明红且, 在.c 文件中包含了 extern "C"時(shí)會(huì)出現(xiàn)編譯語法錯(cuò)誤坝茎。
(2)在 C 中引用 C++語言中的函數(shù)和變量時(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一般用于頭文件中需要聲明該類的某個(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í)行路徑。
線程有自己的堆棧和局部變量因块,但線程之間沒有單獨(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)路
死鎖的處理
答案:鴕鳥策略、預(yù)防策略释液、避免策略全释、檢測(cè)與解除死鎖
52.什么是鍵-值,鍵路徑是什么
答:模型的性質(zhì)是通過一個(gè)簡(jiǎn)單的鍵(通常是個(gè)字符串)來指定的。視圖和控制器通過鍵來查找相應(yīng)的屬性值误债。在一個(gè)給定的實(shí)體中浸船,同一個(gè)屬性的所有值具有相同的數(shù)據(jù)類型。鍵-值編碼技術(shù)用于進(jìn)行這樣的查找—它是一種間接訪問對(duì)象屬性的機(jī)制寝蹈。
鍵路徑是一個(gè)由用點(diǎn)作分隔符的鍵組成的字符串李命,用于指定一個(gè)連接在一起的對(duì)象性質(zhì)序列。第一個(gè)鍵的性質(zhì)是由先前的性質(zhì)決定的箫老,接下來每個(gè)鍵的值也是相對(duì)于其前面的性質(zhì)封字。鍵路徑使您可以以獨(dú)立于模型實(shí)現(xiàn)的方式指定相關(guān)對(duì)象的性質(zhì)。通過鍵路徑耍鬓,您可以指定對(duì)象圖中的一個(gè)任意深度的路徑阔籽,使其指向相關(guān)對(duì)象的特定屬性。
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不是問題
3)在cpp中混用obj-c其實(shí)就是使用obj-c編寫的模塊是我們想要的。 如果模塊以類實(shí)現(xiàn)棕叫,那么要按照cpp class的標(biāo)準(zhǔn)寫類的定義林螃,頭文件中不能出現(xiàn)obj-c的東西,包括#import cocoa的俺泣。實(shí)現(xiàn)文件中疗认,即類的實(shí)現(xiàn)代碼中可以使用obj-c的東西,可以import,只是后綴是mm伏钠。 如果模塊以函數(shù)實(shí)現(xiàn)横漏,那么頭文件要按c的格式聲明函數(shù),實(shí)現(xiàn)文件中熟掂,c++函數(shù)內(nèi)部可以用obj-c缎浇,但后綴還是mm或m。
總結(jié):只要cpp文件和cpp include的文件中不包含obj-c的東西就可以用了赴肚,cpp混用obj-c的關(guān)鍵是使用接口素跺,而不能直接使用實(shí)現(xiàn)代碼二蓝,實(shí)際上cpp混用的是obj-c編譯后的o文件,這個(gè)東西其實(shí)是無差別的指厌,所以可以用刊愚。obj-c的編譯器支持cpp.
54.目標(biāo)-動(dòng)作機(jī)制
答:目標(biāo)是動(dòng)作消息的接收者。一個(gè)控件踩验,或者更為常見的是它的單元鸥诽,以插座變量(參見"插座變量"部分) 的形式保有其動(dòng)作消息的目標(biāo)。
動(dòng)作是控件發(fā)送給目標(biāo)的消息箕憾,或者從目標(biāo)的角度看牡借,它是目標(biāo)為了響應(yīng)動(dòng)作而實(shí)現(xiàn)的方法。程序需要某些機(jī)制來進(jìn)行事件和指令的翻譯厕九。這個(gè)機(jī)制就是目標(biāo)-動(dòng)作機(jī)制蓖捶。
55、 cocoa touch框架
這些框架包括:
Core Animation
通過Core Animation扁远,您就可以通過一個(gè)基于組合獨(dú)立圖層的簡(jiǎn)單的編程模型來創(chuàng)建豐富的用戶體驗(yàn)俊鱼。
Core Audio
Core Audio是播放,處理和錄制音頻的專業(yè)技術(shù)畅买,能夠輕松為您的應(yīng)用程序添加強(qiáng)大的音頻功能并闲。
Core Data提供了一個(gè)面向?qū)ο蟮臄?shù)據(jù)管理解決方案,它易于使用和理解谷羞,甚至可處理任何應(yīng)用或大或小的數(shù)據(jù)模型帝火。
功能列表:框架分類
下面是 Cocoa Touch 中一小部分可用的框架:
音頻和視頻
CoreAudio
OpenAL
MediaLibrary
AVFoundation
數(shù)據(jù)管理
Core Data
SQLite
圖形和動(dòng)畫
CoreAnimation
OpenGL ES
Quartz 2D
網(wǎng)絡(luò)
Bonjour
WebKit
BSDSockets
用戶應(yīng)用
AddressBook
CoreLocation
MapKit
StoreKit
56、objc的內(nèi)存管理
答:如果您通過分配和初始化(比如[[MyClass alloc] init])的方式來創(chuàng)建對(duì)象湃缎,您就擁有這個(gè)對(duì)象犀填,需要負(fù)責(zé)該對(duì)象的釋放。這個(gè)規(guī)則在使用NSObject的便利方法new 時(shí)也同樣適用嗓违。
如果您拷貝一個(gè)對(duì)象九巡,您也擁有拷貝得到的對(duì)象,需要負(fù)責(zé)該對(duì)象的釋放蹂季。如果您保持一個(gè)對(duì)象冕广,您就部分擁有這個(gè)對(duì)象,需要在不再使用時(shí)釋放該對(duì)象偿洁。反過來撒汉,如果您從其它對(duì)象那里接收到一個(gè)對(duì)象,則您不擁有該對(duì)象涕滋,也不應(yīng)該釋放它(這個(gè)規(guī)則有少數(shù)的例外睬辐,在參考文檔中有顯式的說明)。
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是通過一種"referring counting"(引用計(jì)數(shù))的方式來管理內(nèi)存的, 對(duì)象在開始分配內(nèi)存(alloc)的時(shí)候引用計(jì)數(shù)為一,以后每當(dāng)碰到有copy,retain的時(shí)候引用計(jì)數(shù)都會(huì)加一, 每當(dāng)碰到release和autorelease的時(shí)候引用計(jì)數(shù)就會(huì)減一,如果此對(duì)象的計(jì)數(shù)變?yōu)榱?, 就會(huì)被系統(tǒng)銷毀.
2) NSAutoreleasePool就是用來做引用計(jì)數(shù)的管理工作的,這個(gè)東西一般不用你管的.
3)autorelease和release沒什么區(qū)別,只是引用計(jì)數(shù)減一的時(shí)機(jī)不同而已,autorelease會(huì)在對(duì)象的使用真正結(jié)束的時(shí)候才做引用計(jì)數(shù)減一。
58棵帽、類工廠方法是什么熄求?
答:類工廠方法的實(shí)現(xiàn)是為了向客戶提供方便,它們將分配和初始化合在一個(gè)步驟中逗概,返回被創(chuàng)建的對(duì)象弟晚,并進(jìn)行自動(dòng)釋放處理。這些方法的形式是+ (type)className...(其中 className不包括任何前綴)逾苫。
工廠方法可能不僅僅為了方便使用卿城。它們不但可以將分配和初始化合在一起,還可以為初始化過程提供對(duì)象的分配信息铅搓。類工廠方法的另一個(gè)目的是使類(比如NSWorkspace)提供單件實(shí)例瑟押。雖然init...方法可以確認(rèn)一 個(gè)類在每次程序運(yùn)行過程只存在一個(gè)實(shí)例,但它需要首先分配一個(gè)“生的”實(shí)例星掰,然后還必須釋放該實(shí)例多望。工廠方法則可以避免為可能沒有用的對(duì)象盲目分配內(nèi)存。
59. 單件實(shí)例是什么氢烘?
Foundation和Application Kit 框架中的一些類只允許創(chuàng)建單件對(duì)象怀偷,即這些類在當(dāng)前進(jìn)程中的唯一實(shí)例。舉例來說播玖,NSFileManager和NSWorkspace 類在使用時(shí)都是基于進(jìn)程進(jìn)行單件對(duì)象的實(shí)例化枢纠。當(dāng)向這些類請(qǐng)求實(shí)例的時(shí)候,它們會(huì)向您傳遞單一實(shí)例的一個(gè)引用黎棠,如果該實(shí)例還不存在,則首先進(jìn)行實(shí)例的分配和初始化镰绎。單件對(duì)象充當(dāng)控制中心的角色脓斩,負(fù)責(zé)指引或協(xié)調(diào)類的各種服務(wù)。如果類在概念上只有一個(gè)實(shí)例(比如NSWorkspace)畴栖,就應(yīng)該產(chǎn)生一個(gè)單件實(shí)例随静,而不是多個(gè)實(shí)例;如果將來某一天可能有多個(gè)實(shí)例,您可以使用單件實(shí)例機(jī)制燎猛,而不是工廠方法或函數(shù)恋捆。
60、動(dòng)態(tài)綁定
—在運(yùn)行時(shí)確定要調(diào)用的方法
動(dòng)態(tài)綁定將調(diào)用方法的確定也推遲到運(yùn)行時(shí)重绷。在編譯時(shí)沸停,方法的調(diào)用并不和代碼綁定在一起,只有在消實(shí)發(fā)送出來之后昭卓,才確定被調(diào)用的代碼愤钾。通過動(dòng)態(tài)類型和動(dòng)態(tài)綁定技術(shù),您的代碼每次執(zhí)行都可以得到不同的結(jié)果候醒。運(yùn)行時(shí)因子負(fù)責(zé)確定消息的接收者和被調(diào)用的方法能颁。運(yùn)行時(shí)的消息分發(fā)機(jī)制為動(dòng)態(tài)綁定提供支持。當(dāng)您向一個(gè)動(dòng)態(tài)類型確定了的對(duì)象發(fā)送消息時(shí)倒淫,運(yùn)行環(huán)境系統(tǒng)會(huì)通過接收者的isa指針定位對(duì)象的類伙菊,并以此為起點(diǎn)確定被調(diào)用的方法,方法和消息是動(dòng)態(tài)綁定的敌土。而且镜硕,您不必在Objective-C 代碼中做任何工作,就可以自動(dòng)獲取動(dòng)態(tài)綁定的好處纯赎。您在每次發(fā)送消息時(shí)谦疾,特別是當(dāng)消息的接收者是動(dòng)態(tài)類型已經(jīng)確定的對(duì)象時(shí),動(dòng)態(tài)綁定就會(huì)例行而透明地發(fā)生犬金。
61念恍、obj-c的優(yōu)缺點(diǎn)objc
優(yōu)點(diǎn):
- Cateogies 2) Posing 3) 動(dòng)態(tài)識(shí)別 4) 指標(biāo)計(jì)算 5)彈性訊息傳遞 6) 不是一個(gè)過度復(fù)雜的 C 衍生語言 7) Objective-C 與 C++ 可混合編程
缺點(diǎn):
- 不支援命名空間 2) 不支持運(yùn)算符重載 3) 不支持多重繼承 4) 使用動(dòng)態(tài)運(yùn)行時(shí)類型,所有的方法都是函數(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開始的一段字符串拷貝到dst開始的內(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)存疊加的問題嘴办。
sprintf是格式化函數(shù)瞬场。將一段數(shù)據(jù)通過特定的格式,格式化到一個(gè)字符串緩沖區(qū)中去涧郊。sprintf格式化的函數(shù)的長(zhǎng)度不可控贯被,有可能格式化后的字符串會(huì)超出緩沖區(qū)的大小,造成溢出底燎。