史上最全的iOS面試題及答案

1.寫一個NSString類的實(shí)現(xiàn)

+?(id)initWithCString:(c*****t char *)nullTerminatedCString encoding:(NSStringEncoding)encoding;

+ (id) stringWithCString: (c*****t char*)nullTerminatedCString

encoding: (NSStringEncoding)encoding

{

NSString? *obj;

obj = [self allocWithZone: NSDefaultMallocZone()];

obj = [obj initWithCString: nullTerminatedCString encoding: encoding];

return AUTORELEASE(obj);

}

2static關(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 成員變量畅蹂。

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

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

進(jìn)程和線程的主要差別在于它們是不同的操作系統(tǒng)資源管理方式液斜。進(jìn)程有獨(dú)立的地址空間累贤,一個進(jìn)程崩潰后叠穆,在保護(hù)模式下不會對其它進(jìn)程產(chǎn)生影響,而線程只是一個進(jìn)程中的不同執(zhí)行路徑臼膏。線程有自己的堆棧和局部變量硼被,但線程之間沒有單獨(dú)的地址空間,一個線程死掉就等于整個進(jìn)程死掉渗磅,所以多進(jìn)程的程序要比多線程的程序健壯嚷硫,但在進(jìn)程切換時,耗費(fèi)資源較大始鱼,效率要差一些仔掸。但對于一些要求同時進(jìn)行并且又要共享某些變量的并發(fā)操作,只能用線程风响,不能用進(jìn)程嘉汰。

4堆和棧的區(qū)別

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

申請大小:

棧:在Windows下,棧是向低地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu)葫盼,是一塊連續(xù)的內(nèi)存的區(qū)域残腌。這句話的意思是棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預(yù)先規(guī)定好的,在 WINDOWS下贫导,棧的大小是2M(也有的說是1M抛猫,總之是一個編譯時就確定的常數(shù)),如果申請的空間超過棧的剩余空間時孩灯,將提示overflow闺金。因此,能從棧獲得的空間較小峰档。

堆:堆是向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu)败匹,是不連續(xù)的內(nèi)存區(qū)域。這是由于系統(tǒng)是用鏈表來存儲的空閑內(nèi)存地址的讥巡,自然是不連續(xù)的掀亩,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限于計(jì)算機(jī)系統(tǒng)中有效的虛擬內(nèi)存欢顷。由此可見槽棍,堆獲得的空間比較靈活,也比較大。

碎片問題:對于堆來講刹泄,頻繁的new/delete勢必會造成內(nèi)存空間的不連續(xù)外里,從而造成大量的碎片,使程序效率降低特石。對于棧來講,則不會存在這個問題鳖链,因?yàn)闂J窍冗M(jìn)后出的隊(duì)列姆蘸,他們是如此的一一對應(yīng),以至于永遠(yuǎn)都不可能有一個內(nèi)存塊從棧中間彈出

分配方式:堆都是動態(tài)分配的芙委,沒有靜態(tài)分配的堆逞敷。棧有2種分配方式:靜態(tài)分配和動態(tài)分配。靜態(tài)分配是編譯器完成的灌侣,比如局部變量的分配推捐。動態(tài)分配由alloca函數(shù)進(jìn)行分配,但是棧的動態(tài)分配和堆是不同的侧啼,他的動態(tài)分配是由編譯器進(jìn)行釋放牛柒,無需我們手工實(shí)現(xiàn)。

分配效率:棧是機(jī)器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu)痊乾,計(jì)算機(jī)會在底層對棧提供支持:分配專門的寄存器存放棧的地址皮壁,壓棧出棧都有專門的指令執(zhí)行,這就決定了棧的效率比較高哪审。堆則是C/C++函數(shù)庫提供的蛾魄,它的機(jī)制是很復(fù)雜的。

5什么是鍵值湿滓,鍵值是什么滴须?

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

鍵路徑是一個由用點(diǎn)作分隔符的鍵組成的字符串铭污,用于指定一個連接在一起的對象性質(zhì)序列。第一個鍵的

性質(zhì)是由先前的性質(zhì)決定的膀篮,接下來每個鍵的值也是相對于其前面的性質(zhì)嘹狞。鍵路徑使您可以以獨(dú)立于模型

實(shí)現(xiàn)的方式指定相關(guān)對象的性質(zhì)。通過鍵路徑誓竿,您可以指定對象圖中的一個任意深度的路徑磅网,使其指向相

關(guān)對象的特定屬性。

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

目標(biāo)是動作消息的接收者筷屡。一個控件涧偷,或者更為常見的是它的單元簸喂,以插座變量(參見"插座變量"部分)

的形式保有其動作消息的目標(biāo)。

動作是控件發(fā)送給目標(biāo)的消息燎潮,或者從目標(biāo)的角度看喻鳄,它是目標(biāo)為了響應(yīng)動作而實(shí)現(xiàn)的方法。

程序需要某些機(jī)制來進(jìn)行事件和指令的翻譯确封。這個機(jī)制就是目標(biāo)-動作機(jī)制除呵。

7objc的內(nèi)存管理

????如果您通過分配和初始化(比如[[MyClass alloc] init])的方式來創(chuàng)建對象,您就擁

有這個對象爪喘,需要負(fù)責(zé)該對象的釋放颜曾。這個規(guī)則在使用NSObject的便利方法new 時也同樣適用。

??? 如果您拷貝一個對象秉剑,您也擁有拷貝得到的對象泛豪,需要負(fù)責(zé)該對象的釋放。

??? 如果您保持一個對象侦鹏,您就部分擁有這個對象诡曙,需要在不再使用時釋放該對象。

反過來种柑,

??? 如果您從其它對象那里接收到一個對象岗仑,則您不擁有該對象,也不應(yīng)該釋放它(這個規(guī)則有少數(shù)

的例外聚请,在參考文檔中有顯式的說明)荠雕。

8 自動釋放池是什么,如何工作

當(dāng)您向一個對象發(fā)送一個autorelease消息時,Cocoa就會將該對象的一個引用放入到最新的自動釋放池驶赏。它仍然是個正當(dāng)?shù)膶ο笳ū埃虼俗詣俞尫懦囟x的作用域內(nèi)的其它對象可以向它發(fā)送消息。當(dāng)程序執(zhí)行到作用域結(jié)束的位置時煤傍,自動釋放池就會被釋放盖文,池中的所有對象也就被釋放。

1.? ojc-c?是通過一種"referring counting"(引用計(jì)數(shù))的方式來管理內(nèi)存的, 對象在開始分配內(nèi)存(alloc)的時候引用計(jì)數(shù)為一,以后每當(dāng)碰到有copy,retain的時候引用計(jì)數(shù)都會加一, 每當(dāng)碰到release和autorelease的時候引用計(jì)數(shù)就會減一,如果此對象的計(jì)數(shù)變?yōu)榱?, 就會被系統(tǒng)銷毀.

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

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

9類工廠方法是什么

類工廠方法的實(shí)現(xiàn)是為了向客戶提供方便蚯姆,它們將分配和初始化合在一個步驟中五续,返回被創(chuàng)建的對象,并

進(jìn)行自動釋放處理龄恋。這些方法的形式是+ (type)className...(其中 className不包括任何前綴)疙驾。

工廠方法可能不僅僅為了方便使用。它們不但可以將分配和初始化合在一起郭毕,還可以為初始化過程提供對

象的分配信息它碎。

類工廠方法的另一個目的是使類(比如NSWorkspace)提供單件實(shí)例。雖然init...方法可以確認(rèn)一

個類在每次程序運(yùn)行過程只存在一個實(shí)例,但它需要首先分配一個“生的”實(shí)例扳肛,然后還必須釋放該實(shí)例傻挂。

工廠方法則可以避免為可能沒有用的對象盲目分配內(nèi)存。

10單件實(shí)例是什么

Foundation?和 Application Kit 框架中的一些類只允許創(chuàng)建單件對象挖息,即這些類在當(dāng)前進(jìn)程中的唯一實(shí)例金拒。舉例來說,NSFileManager 和NSWorkspace 類在使用時都是基于進(jìn)程進(jìn)行單件對象的實(shí)例化旋讹。當(dāng)向這些類請求實(shí)例的時候殖蚕,它們會向您傳遞單一實(shí)例的一個引用,如果該實(shí)例還不存在沉迹,則首先進(jìn)行實(shí)例的分配和初始化。單件對象充當(dāng)控制中心的角色害驹,負(fù)責(zé)指引或協(xié)調(diào)類的各種服務(wù)鞭呕。如果類在概念上只有一個實(shí)例(比如

NSWorkspace),就應(yīng)該產(chǎn)生一個單件實(shí)例宛官,而不是多個實(shí)例葫松;如果將來某一天可能有多個實(shí)例,您可

以使用單件實(shí)例機(jī)制底洗,而不是工廠方法或函數(shù)腋么。

11動態(tài)綁定

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

動態(tài)綁定將調(diào)用方法的確定也推遲到運(yùn)行時。在編譯時亥揖,方法的調(diào)用并不和代碼綁定在一起珊擂,只有在消實(shí)發(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ǎn)確定被調(diào)用的方法在张,方法和消息是動態(tài)綁定的。而且矮慕,您不必在Objective-C 代碼中做任何工作帮匾,就可以自動獲取動態(tài)綁定的好處。您在每次發(fā)送消息時凡傅,

特別是當(dāng)消息的接收者是動態(tài)類型已經(jīng)確定的對象時辟狈,動態(tài)綁定就會例行而透明地發(fā)生。

12obj-c的優(yōu)缺點(diǎn)

objc優(yōu)點(diǎn):

1) Cateogies

2) Posing

3) 動態(tài)識別

4) 指標(biāo)計(jì)算

5)彈性訊息傳遞

6) 不是一個過度復(fù)雜的 C 衍生語言

7) Objective-C 與 C++ 可混合編程

缺點(diǎn):

1)?不支援命名空間

2)??不支持運(yùn)算符重載

3)不支持多重繼承

4)使用動態(tài)運(yùn)行時類型,所有的方法都是函數(shù)調(diào)用哼转,所以很多編譯時優(yōu)化方法都用不到明未。(如內(nèi)聯(lián)函數(shù)等),性能低劣壹蔓。

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

strcpy是一個字符串拷貝的函數(shù)趟妥,它的函數(shù)原型為strcpy(char *dst, c*****t char *src);

將 src開始的一段字符串拷貝到dst開始的內(nèi)存中去,結(jié)束的標(biāo)志符號為'\0'佣蓉,由于拷貝的長度不是由我們自己控制的披摄,所以這個字符串拷貝很容易出錯。具備字符串拷貝功能的函數(shù)有memcpy勇凭,這是一個內(nèi)存拷貝函數(shù)疚膊,它的函數(shù)原型為memcpy(char *dst, c*****t char* src, unsigned int len);

將長度為len的一段內(nèi)存,從src拷貝到dst中去虾标,這個函數(shù)的長度可控寓盗。但是會有內(nèi)存疊加的問題。

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

14答案是:

a) int a; // An integer

b) int *a; // A pointer to an integer

c) int **a; // A pointer to a pointer to an integer

d) int a[10]; // An array of 10 integers

e) int *a[10]; // An array of 10 pointers to integers

f) int (*a)[10]; // A pointer to an array of 10 integers

g) int (*a)(int); // A pointer to a function a that? takes an integer argument and returns an integer

h) int (*a[10])(int); // An array of 10 pointers to functi*****? that take an integer argument and return an integer

15.readwrite库继,readonly箩艺,assignretain制跟,copy舅桩,nonatomic屬性的作用

@property是一個屬性訪問聲明,擴(kuò)號內(nèi)支持以下幾個屬性:

1雨膨,getter=getterName擂涛,setter=setterName,設(shè)置setter與getter的方法名

2聊记,readwrite,readonly撒妈,設(shè)置可供訪問級別

2,assign排监,setter方法直接賦值狰右,不進(jìn)行任何retain操作,為了解決原類型與環(huán)循引用問題

3舆床,retain棋蚌,setter方法對參數(shù)進(jìn)行release舊值再retain新值嫁佳,所有實(shí)現(xiàn)都是這個順序(CC上有相關(guān)資料)

4,copy谷暮,setter方法進(jìn)行Copy操作蒿往,與retain處理流程一樣,先舊值release湿弦,再Copy出新的對象瓤漏,retainCount為1。這是為了減少對上下文的依賴而引入的機(jī)制颊埃。

copy是在你不希望a和b共享一塊內(nèi)存時會使用到蔬充。a和b各自有自己的內(nèi)存。

5班利,nonatomic饥漫,非原子性訪問,不加同步罗标,多線程并發(fā)訪問會提高性能趾浅。注意,如果不加此屬性盖腕,則默認(rèn)是兩個訪問方法都為原子型事務(wù)訪問祖今。鎖被加到所屬對象實(shí)例級(我是這么理解的...)。

atomic和nonatomic用來決定編譯器生成的getter和setter是否為原子操作。在多線程環(huán)境下丛版,原子操作是必要的,否則有可能引起錯 誤的結(jié)果之拨。加了atomic旭旭,setter函數(shù)會變成下面這樣:

16什么時候用delegate,什么時候用Notification不见?答:delegate針對one-to-one關(guān)系澳化,并且reciever可以返回值 給sender,notification 可以針對one-to-one/many/none,reciever無法返回值給sender.所以稳吮,delegate用于sender希望接受到 reciever的某個功能反饋值缎谷,notification用于通知多個object某個事件。

17什么是KVC和KVO灶似?答:KVC(Key-Value-Coding)內(nèi)部的實(shí)現(xiàn):一個對象在調(diào)用setValue的時候列林,(1)首先根據(jù)方法名找到運(yùn)行方法的時候所需要的環(huán)境參數(shù)。(2)他會從自己isa指針結(jié)合環(huán)境參數(shù)酪惭,找到具體的方法實(shí)現(xiàn)的接口希痴。(3)再直接查找得來的具體的方法實(shí)現(xiàn)。KVO(Key-Value- Observing):當(dāng)觀察者為一個對象的屬性進(jìn)行了注冊春感,被觀察對象的isa指針被修改的時候砌创,isa指針就會指向一個中間類虏缸,而不是真實(shí)的類。所以 isa指針其實(shí)不需要指向?qū)嵗龑ο笳鎸?shí)的類嫩实。所以我們的程序最好不要依賴于isa指針刽辙。在調(diào)用類的方法的時候,最好要明確對象實(shí)例的類名

18ViewController 的 loadView, viewDidLoad, viewDidUnload 分別是在什么時候調(diào)用的舶赔?在自定義ViewController的時候這幾個函數(shù)里面應(yīng)該做什么工作扫倡?答:viewDidLoad在view 從nib文件初始化時調(diào)用,loadView在controller的view為nil時調(diào)用竟纳。此方法在編程實(shí)現(xiàn)view時調(diào)用,view 控制器默認(rèn)會注冊memory warning notification,當(dāng)view controller的任何view 沒有用的時候撵溃,viewDidUnload會被調(diào)用,在這里實(shí)現(xiàn)將retain 的view release,如果是retain的IBOutlet view 屬性則不要在這里release,IBOutlet會負(fù)責(zé)release 锥累。

19

"NSMutableString *"這個數(shù)據(jù)類型則是代表"NSMutableString"對象本身缘挑,這兩者是有區(qū)別的。

而NSString只是對象的指針而已桶略。

面向過程就是分析出解決問題所需要的步驟语淘,然后用函數(shù)把這些步驟一步一步實(shí)現(xiàn),使用的時候一個一個依次調(diào)用就可以了际歼。

面向?qū)ο笫前褬?gòu)成問題事務(wù)分解成各個對象惶翻,建立對象的目的不是為了完成一個步驟,而是為了描敘某個事物在整個解決問題的步驟中的行為鹅心。吕粗;

20類別的作用

類別主要有3個作用:

(1)將類的實(shí)現(xiàn)分散到多個不同文件或多個不同框架中。

(2)創(chuàng)建對私有方法的前向引用旭愧。

(3)向?qū)ο筇砑臃钦絽f(xié)議颅筋。

類別的局限性

有兩方面局限性:

(1)無法向類中添加新的實(shí)例變量,類別沒有位置容納實(shí)例變量输枯。

(2)名稱沖突议泵,即當(dāng)類別中的方法與原始類方法名稱沖突時,類別具有更高的優(yōu)先級桃熄。類別方法將完全取代初始方法從而無法再使用初始方法先口。

無法添加實(shí)例變量的局限可以使用字典對象解決

21關(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因?yàn)樗赡鼙灰庀氩坏降馗淖兩璋肌K莄onst因?yàn)槌绦虿粦?yīng)該試圖去修改它。

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

22@synthesize 是系統(tǒng)自動生成getter和setter屬性聲明

@dynamic 是開發(fā)者自已提供相應(yīng)的屬性聲明

@dynamic 意思是由開發(fā)人員提供相應(yīng)的代碼:對于只讀屬性需要提供 setter钻洒,對于讀寫屬性需要提供 setter 和 getter奋姿。@synthesize 意思是,除非開發(fā)人員已經(jīng)做了素标,否則由編譯器生成相應(yīng)的代碼称诗,以滿足屬性聲明。

查閱了一些資料確定@dynamic的意思是告訴編譯器,屬性的獲取與賦值方法由用戶自己實(shí)現(xiàn), 不自動生成头遭。

23Difference between shallow copy and deep copy?

淺復(fù)制和深復(fù)制的區(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引用的對象同樣被修改澜术,這其實(shí)違背了我們復(fù)制拷貝的一個思想艺蝴。深復(fù)制就好理解了,內(nèi)存中存在了

兩份獨(dú)立對象本身。

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

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

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

24What is advantage of categories? What is difference between implementing a category and inheritance?

類別的作用?繼承和類別在實(shí)現(xiàn)中有何區(qū)別添寺?

答案:category 可以在不獲悉胯盯,不改變原來代碼的情況下往里面添加新的方法,只能添加计露,不能刪除修改博脑。

并且如果類別和原來類中的方法產(chǎn)生名稱沖突憎乙,則類別將覆蓋原來的方法,因?yàn)轭悇e具有更高的優(yōu)先級叉趣。

類別主要有3個作用:

(1)將類的實(shí)現(xiàn)分散到多個不同文件或多個不同框架中泞边。

(2)創(chuàng)建對私有方法的前向引用。

(3)向?qū)ο筇砑臃钦絽f(xié)議疗杉。

繼承可以增加阵谚,修改或者刪除方法,并且可以增加屬性烟具。

25.Difference between categories and extensions?

類別和類擴(kuò)展的區(qū)別梢什。

答案:category和extensions的不同在于 后者可以添加屬性。另外后者添加的方法是必須要實(shí)現(xiàn)的净赴。

extensions可以認(rèn)為是一個私有的Category绳矩。

26.Difference between protocol in objective c and interfaces in java?

oc中的協(xié)議和java中的接口概念有何不同?

答案:OC中的代理有2層含義玖翅,官方定義為 formal和informal protocol翼馆。前者和Java接口一樣。

informal protocol中的方法屬于設(shè)計(jì)模式考慮范疇金度,不是必須實(shí)現(xiàn)的应媚,但是如果有實(shí)現(xiàn),就會改變類的屬性猜极。

其實(shí)關(guān)于正式協(xié)議中姜,類別和非正式協(xié)議我很早前學(xué)習(xí)的時候大致看過,也寫在了學(xué)習(xí)教程里

“非正式協(xié)議概念其實(shí)就是類別的另一種表達(dá)方式“這里有一些你可能希望實(shí)現(xiàn)的方法跟伏,你可以使用他們更好的完成工作”丢胚。

這個意思是,這些是可選的受扳。比如我門要一個更好的方法携龟,我們就會申明一個這樣的類別去實(shí)現(xiàn)。然后你在后期可以直接使用這些更好的方法勘高。

這么看峡蟋,總覺得類別這玩意兒有點(diǎn)像協(xié)議的可選協(xié)議。"

現(xiàn)在來看华望,其實(shí)protocal已經(jīng)開始對兩者都統(tǒng)一和規(guī)范起來操作蕊蝗,因?yàn)橘Y料中說“非正式協(xié)議使用interface修飾“,

現(xiàn)在我們看到協(xié)議中兩個修飾詞:“必須實(shí)現(xiàn)(@requied)”和“可選實(shí)現(xiàn)(@optional)”赖舟。

26What are KVO and KVC?

答案:kvc:鍵 - 值編碼是一種間接訪問對象的屬性使用字符串來標(biāo)識屬性蓬戚,而不是通過調(diào)用存取方法,直接或通過實(shí)例變量訪問的機(jī)制宾抓。

很多情況下可以簡化程序代碼碌更。apple文檔其實(shí)給了一個很好的例子裕偿。

kvo:鍵值觀察機(jī)制,他提供了觀察某一屬性變化的方法痛单,極大的簡化了代碼嘿棘。

具體用看到嗯哼用到過的一個地方是對于按鈕點(diǎn)擊變化狀態(tài)的的監(jiān)控。

比如我自定義的一個button

[cpp]

[self addObserver:self forKeyPath:@"highlighted" options:0 context:nil];

#pragma mark KVO

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

{

if ([keyPath isEqualToString:@"highlighted"] ) {

[self setNeedsDisplay];

}

}

對于系統(tǒng)是根據(jù)keypath去取的到相應(yīng)的值發(fā)生改變旭绒,理論上來說是和kvc機(jī)制的道理是一樣的鸟妙。

對于kvc機(jī)制如何通過key尋找到value:

“當(dāng)通過KVC調(diào)用對象時,比如:[self valueForKey:@”someKey”]時挥吵,程序會自動試圖通過幾種不同的方式解析這個調(diào)用重父。首先查找對象是否帶有 someKey 這個方法,如果沒找到忽匈,會繼續(xù)查找對象是否帶有someKey這個實(shí)例變量(iVar)房午,如果還沒有找到,程序會繼續(xù)試圖調(diào)用 -(id) valueForUndefinedKey:這個方法丹允。如果這個方法還是沒有被實(shí)現(xiàn)的話郭厌,程序會拋出一個NSUndefinedKeyException異常錯誤。

(cocoachina.com注:Key-Value Coding查找方法的時候雕蔽,不僅僅會查找someKey這個方法折柠,還會查找getsomeKey這個方法,前面加一個get批狐,或者_(dá)someKey以及_getsomeKey這幾種形式扇售。同時,查找實(shí)例變量的時候也會不僅僅查找someKey這個變量嚣艇,也會查找_someKey這個變量是否存在承冰。)

設(shè)計(jì)valueForUndefinedKey:方法的主要目的是當(dāng)你使用-(id)valueForKey方法從對象中請求值時,對象能夠在錯誤發(fā)生前食零,有最后的機(jī)會響應(yīng)這個請求巷懈。這樣做有很多好處,下面的兩個例子說明了這樣做的好處慌洪。“

來至cocoa凑保,這個說法應(yīng)該挺有道理冈爹。

因?yàn)槲覀冎纀utton卻是存在一個highlighted實(shí)例變量.因此為何上面我們只是add一個相關(guān)的keypath就行了,

27What is purpose of delegates?

代理的作用欧引?

答案:代理的目的是改變或傳遞控制鏈频伤。允許一個類在某些特定時刻通知到其他類,而不需要獲取到那些類的指針芝此”镄ぃ可以減少框架復(fù)雜度因痛。

另外一點(diǎn),代理可以理解為java中的回調(diào)監(jiān)聽機(jī)制的一種類似岸更。

28What are mutable and immutable types in Objective C?

oc中可修改和不可以修改類型鸵膏。

答案:可修改不可修改的集合類。這個我個人簡單理解就是可動態(tài)添加修改和不可動態(tài)添加修改一樣怎炊。

比如NSArray和NSMutableArray谭企。前者在初始化后的內(nèi)存控件就是固定不可變的,后者可以添加等评肆,可以動態(tài)申請新的內(nèi)存空間

29When we call objective c is runtime language what does it mean?

我們說的oc是動態(tài)運(yùn)行時語言是什么意思债查?

答案:多態(tài)。主要是將數(shù)據(jù)類型的確定由編譯時瓜挽,推遲到了運(yùn)行時盹廷。

這個問題其實(shí)淺涉及到兩個概念,運(yùn)行時和多態(tài)久橙。

簡單來說俄占,運(yùn)行時機(jī)制使我們直到運(yùn)行時才去決定一個對象的類別,以及調(diào)用該類別對象指定方法剥汤。

多態(tài):不同對象以自己的方式響應(yīng)相同的消息的能力叫做多態(tài)颠放。意思就是假設(shè)生物類(life)都用有一個相同的方法-eat;

那人類屬于生物,豬也屬于生物吭敢,都繼承了life后碰凶,實(shí)現(xiàn)各自的eat,但是調(diào)用是我們只需調(diào)用各自的eat方法鹿驼。

也就是不同的對象以自己的方式響應(yīng)了相同的消息(響應(yīng)了eat這個選擇器)欲低。

因此也可以說,運(yùn)行時機(jī)制是多態(tài)的基礎(chǔ)畜晰?~~~

30what is difference between NSNotification and protocol?

通知和協(xié)議的不同之處砾莱?

答案:協(xié)議有控制鏈(has-a)的關(guān)系,通知沒有凄鼻。

首先我一開始也不太明白腊瑟,什么叫控制鏈(專業(yè)術(shù)語了~)。但是簡單分析下通知和代理的行為模式块蚌,我們大致可以有自己的理解

簡單來說闰非,通知的話,它可以一對多峭范,一條消息可以發(fā)送給多個消息接受者财松。

代理按我們的理解,到不是直接說不能一對多,比如我們知道的明星經(jīng)濟(jì)代理人辆毡,很多時候一個經(jīng)濟(jì)人負(fù)責(zé)好幾個明星的事務(wù)菜秦。

只是對于不同明星間,代理的事物對象都是不一樣的舶掖,一一對應(yīng)球昨,不可能說明天要處理A明星要一個發(fā)布會,代理人發(fā)出處理發(fā)布會的消息后访锻,別稱B的

發(fā)布會了褪尝。但是通知就不一樣,他只關(guān)心發(fā)出通知期犬,而不關(guān)心多少接收到感興趣要處理河哑。

因此控制鏈(has-a從英語單詞大致可以看出,單一擁有和可控制的對應(yīng)關(guān)系龟虎。

31What is push notification?

什么是推送消息璃谨?

答案:太簡單,不作答~~~~~~~~~~

這是cocoa上的答案鲤妥。

其實(shí)到不是說太簡單佳吞,只是太泛泛的一個概念的東西。就好比說棉安,什么是人底扳。

推送通知更是一種技術(shù)。

簡單點(diǎn)就是客戶端獲取資源的一種手段贡耽。

普通情況下衷模,都是客戶端主動的pull。

推送則是服務(wù)器端主動push蒲赂。

32.Polymorphism阱冶?

關(guān)于多態(tài)性

答案:多態(tài),子類指針可以賦值給父類滥嘴。

這個題目其實(shí)可以出到一切面向?qū)ο笳Z言中木蹬,

因此關(guān)于多態(tài),繼承和封裝基本最好都有個自我意識的理解若皱,也并非一定要把書上資料上寫的能背出來镊叁。

最重要的是轉(zhuǎn)化成自我理解。

33

What is responder chain?

說說響應(yīng)鏈

答案:事件響應(yīng)鏈走触。包括點(diǎn)擊事件晦譬,畫面刷新事件等。在視圖棧內(nèi)從上至下饺汹,或者從下之上傳播。

可以說點(diǎn)事件的分發(fā)痰催,傳遞以及處理兜辞。具體可以去看下touch事件這塊迎瞧。因?yàn)閱柕奶橄蠡?/p>

嚴(yán)重懷疑題目出到越后面就越籠統(tǒng)。

34Difference between frame and bounds?

frame和bounds有什么不同逸吵?

答案:frame指的是:該view在父view坐標(biāo)系統(tǒng)中的位置和大小凶硅。(參照點(diǎn)是父親的坐標(biāo)系統(tǒng))

bounds指的是:該view在本身坐標(biāo)系統(tǒng)中 的位置和大小。(參照點(diǎn)是本身坐標(biāo)系統(tǒng))

35

.Difference between method and selector?

方法和選擇器有何不同扫皱?

答案:selector是一個方法的名字足绅,method是一個組合體,包含了名字和實(shí)現(xiàn).

36NSOperation queue?

答案:存放NSOperation的集合類韩脑。

操作和操作隊(duì)列氢妈,基本可以看成java中的線程和線程池的概念。用于處理ios多線程開發(fā)的問題段多。

網(wǎng)上部分資料提到一點(diǎn)是首量,雖然是queue,但是卻并不是帶有隊(duì)列的概念进苍,放入的操作并非是按照嚴(yán)格的先進(jìn)現(xiàn)出加缘。

這邊又有個疑點(diǎn)是,對于隊(duì)列來說觉啊,先進(jìn)先出的概念是Afunc添加進(jìn)隊(duì)列拣宏,Bfunc緊跟著也進(jìn)入隊(duì)列,Afunc先執(zhí)行這個是必然的杠人,

但是Bfunc是等Afunc完全操作完以后勋乾,B才開始啟動并且執(zhí)行,因此隊(duì)列的概念離亂上有點(diǎn)違背了多線程處理這個概念搜吧。

但是轉(zhuǎn)念一想其實(shí)可以參考銀行的取票和叫號系統(tǒng)市俊。

因此對于A比B先排隊(duì)取票但是B率先執(zhí)行完操作,我們亦然可以感性認(rèn)為這還是一個隊(duì)列滤奈。

但是后來看到一票關(guān)于這操作隊(duì)列話題的文章摆昧,其中有一句提到

“因?yàn)閮蓚€操作提交的時間間隔很近,線程池中的線程蜒程,誰先啟動是不定的绅你。”

瞬間覺得這個queue名字有點(diǎn)忽悠人了昭躺,還不如pool~

綜合一點(diǎn)忌锯,我們知道他可以比較大的用處在于可以幫組多線程編程就好了。

37What is lazy loading?

答案:懶漢模式领炫,只在用到的時候才去初始化商架。

也可以理解成延時加載。

我覺得最好也最簡單的一個列子就是tableView中圖片的加載顯示了寞肖。

一個延時載,避免內(nèi)存過高脚猾,一個異步加載,避免線程堵塞砚哗。

38Can we use two tableview controllers on one viewcontroller?

是否在一個視圖控制器中嵌入兩個tableview控制器龙助?

答案:一個視圖控制只提供了一個View視圖,理論上一個tableViewController也不能放吧蛛芥,

只能說可以嵌入一個tableview視圖提鸟。當(dāng)然,題目本身也有歧義仅淑,如果不是我們定性思維認(rèn)為的UIViewController称勋,

而是宏觀的表示視圖控制者,那我們倒是可以把其看成一個視圖控制者漓糙,它可以控制多個視圖控制器铣缠,比如TabbarController

那樣的感覺。

39Can 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í)是在數(shù)據(jù)源關(guān)聯(lián)的代理方法里實(shí)現(xiàn)的捡硅。

因此我們并不關(guān)心如何去關(guān)聯(lián)他,他怎么關(guān)聯(lián)上盗棵,方法只是讓我返回根據(jù)自己的需要去設(shè)置如相關(guān)的數(shù)據(jù)源壮韭。

因此,我覺得可以設(shè)置多個數(shù)據(jù)源啊纹因,但是有個問題是喷屋,你這是想干嘛呢?想讓列表如何顯示瞭恰,不同的數(shù)據(jù)源分區(qū)塊顯示屯曹?

40id、nil代表什么惊畏?

id和void *并非完全一樣恶耽。在上面的代碼中,id是指向struct 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對象冻辩,這個對象的指針指向空(沒有東西就是空)猖腕。

首字母大寫的Nil和nil有一點(diǎn)不一樣,Nil定義一個指向空的類(是Class恨闪,而不是對象)倘感。

SEL是“selector”的一個類型,表示一個方法的名字

Method(我們常說的方法)表示一種類型咙咽,這種類型與selector和實(shí)現(xiàn)(implementation)相關(guān)

IMP定義為id(*IMP) (id,SEL, …)老玛。這樣說來,IMP是一個指向函數(shù)的指針钧敞,這個被指向的函數(shù)包括id(“self”指針)蜡豹,調(diào)用的SEL(方法名),再加上一些其他參數(shù).說白了IMP就是實(shí)現(xiàn)方法溉苛。

41圖層和UIView的區(qū)別是什么镜廉?

答:兩者最大的區(qū)別是,圖層不會直接渲染到屏幕上,UIView是iOS系統(tǒng)中界面元素的基礎(chǔ)愚战,所有的界面元素都是繼承自它娇唯。它本身完全是由CoreAnimation來實(shí)現(xiàn)的。它真正的繪圖部分寂玲,是由一個CALayer類來管理塔插。UIView本身更像是一個CALayer的管理器。一個UIView上可以有n個CALayer拓哟,每個layer顯示一種東西想许,增強(qiáng)UIView的展現(xiàn)能力。

42GCD為Grand Central Dispatch的縮寫彰檬∩烊校  Grand Central Dispatch (GCD)是Apple開發(fā)的一個多核編程的較新的解決方法。在Mac OS X 10.6雪豹中首次推出逢倍,并在最近引入到了iOS4.0捧颅。  GCD是一個替代諸如NSThread等技術(shù)的很高效和強(qiáng)大的技術(shù)较雕。GCD完全可以處理諸如數(shù)據(jù)鎖定和資源泄漏等復(fù)雜的異步編程問題碉哑。

GCD可以完成很多事情挚币,但是這里僅關(guān)注在iOS應(yīng)用中實(shí)現(xiàn)多線程所需的一些基礎(chǔ)知識】鄣洌  在開始之前妆毕,需要理解是要提供給GCD隊(duì)列的是代碼塊,用于在系統(tǒng)或者用戶創(chuàng)建的的隊(duì)列上調(diào)度運(yùn)行贮尖。聲明一個隊(duì)列

如下會返回一個用戶創(chuàng)建的隊(duì)列:

dispatch_queue_t myQueue = dispatch_queue_create("com.iphonedevblog.post", NULL);其中笛粘,第一個參數(shù)是標(biāo)識隊(duì)列的,第二個參數(shù)是用來定義隊(duì)列的參數(shù)(目前不支持湿硝,因此傳入NULL)薪前。

執(zhí)行一個隊(duì)列

如下會異步執(zhí)行傳入的代碼:

dispatch_async(myQueue, ^{ [self doSomething]; });其中,首先傳入之前創(chuàng)建的隊(duì)列关斜,然后提供由隊(duì)列運(yùn)行的代碼塊示括。

聲明并執(zhí)行一個隊(duì)列

如果不需要保留要運(yùn)行的隊(duì)列的引用,可以通過如下代碼實(shí)現(xiàn)之前的功能:  dispatch_async(dispatch_queue_create ("com.iphonedevblog.post", NULL), ^{ [self doSomething]; });如果需要暫停一個隊(duì)列痢畜,可以調(diào)用如下代碼垛膝。暫停一個隊(duì)列會阻止和該隊(duì)列相關(guān)的所有代碼運(yùn)行《∠。  dispatch_suspend(myQueue);暫停一個隊(duì)列

如果暫停一個隊(duì)列不要忘記恢復(fù)吼拥。暫停和恢復(fù)的操作和內(nèi)存管理中的retain和release類似。調(diào)用dispatch_suspend會增加暫停計(jì)數(shù)线衫,而dispatch_resume則會減少扔罪。隊(duì)列只有在暫停計(jì)數(shù)變成零的情況下才開始運(yùn)行。dispatch_resume(myQueue);恢復(fù)一個隊(duì)列從隊(duì)列中在主線程運(yùn)行代碼有些操作無法在異步隊(duì)列運(yùn)行桶雀,因此必須在主線程(每個應(yīng)用都有一個)上運(yùn)行矿酵。UI繪圖以及任何對NSNotificationCenter的調(diào)用必須在主線程長進(jìn)行。在另一個隊(duì)列中訪問主線程并運(yùn)行代碼的示例如下:  dispatch_sync(dispatch_get_main_queue(), ^{ [self dismissLoginWindow]; });注意矗积,dispatch_suspend (以及dispatch_resume)在主線程上不起作用全肮。

使用GCD,可以讓你的程序不會失去響應(yīng). 多線程不容易使用棘捣,用了GCD辜腺,會讓它變得簡單。你無需專門進(jìn)行線程管理, 很棒乍恐!

dispatch_queue_tt1=dispatch_queue_create("1",NULL);

dispatch_queue_tt2=dispatch_queue_create("2",NULL);

dispatch_async(t1, ^{

[selfprint1];

});

dispatch_async(t2, ^{

[selfprint2];

});

43Provider是指某個iPhone軟件的Push服務(wù)器评疗,這篇文章我將使用.net作為Provider。

APNS 是Apple Push Notification Service(Apple Push服務(wù)器)的縮寫茵烈,是蘋果的服務(wù)器百匆。

上圖可以分為三個階段。

第一階段:.net應(yīng)用程序把要發(fā)送的消息呜投、目的iPhone的標(biāo)識打包加匈,發(fā)給APNS存璃。

第二階段:APNS在自身的已注冊Push服務(wù)的iPhone列表中,查找有相應(yīng)標(biāo)識的iPhone雕拼,并把消息發(fā)到iPhone纵东。

第三階段:iPhone把發(fā)來的消息傳遞給相應(yīng)的應(yīng)用程序,并且按照設(shè)定彈出Push通知啥寇。

http://blog.csdn.net/zhuqilin0/article/details/6527113 ? ?//消息推送機(jī)制

看內(nèi)存泄露時候:在搜索中搜索run 找到Run Static Snalyzer .

44.可擴(kuò)展標(biāo)記語言extensible markup language;XML

2.用于標(biāo)記電子文件使其具有結(jié)構(gòu)性的標(biāo)記語言偎球,可以用來標(biāo)記數(shù)據(jù)、定義數(shù)據(jù)類型辑甜,是一種允許用戶對自己的標(biāo)記語言進(jìn)行定義的源語言甜橱。

3,數(shù)據(jù)庫提供了更強(qiáng)有力的數(shù)據(jù)存儲和分析能力栈戳,例如:數(shù)據(jù)索引、排序难裆、查找子檀、相關(guān)一致性等,XML僅僅是存儲數(shù)據(jù)乃戈。

4.XML與HTML的設(shè)計(jì)區(qū)別是:XML的核心是數(shù)據(jù)褂痰,其重點(diǎn)是數(shù)據(jù)的內(nèi)容。而HTML 被設(shè)計(jì)用來顯示數(shù)據(jù)症虑,其重點(diǎn)是數(shù)據(jù)的顯示缩歪。

5.XML和HTML語法區(qū)別:HTML的標(biāo)記不是所有的都需要成對出現(xiàn),XML則要求所有的標(biāo)記必須成對出現(xiàn)谍憔;HTML標(biāo)記不區(qū)分大小寫匪蝙,XML則大小敏感,即區(qū)分大小寫。

結(jié)合

XML的簡單使其易于在任何應(yīng)用程序中讀寫數(shù)據(jù)习贫,這使XML很快成為數(shù)據(jù)交換的唯一公共語言逛球,雖然不同的應(yīng)用軟件也支持其它的數(shù)據(jù)交換格式,但不久之后他們都將支持XML苫昌,那就意味著程序可以更容易的與Windows,Mac OS,Linux以及其他平臺下產(chǎn)生的信息結(jié)合颤绕,然后可以很容易加載XML數(shù)據(jù)到程序中并分析他,并以XML格式輸出結(jié)果祟身。

XML去掉了之前令許多開發(fā)人員頭疼的SGML(標(biāo)準(zhǔn)通用標(biāo)記語言)的隨意語法奥务。在XML中,采用了如下的語法:

1 任何的起始標(biāo)簽都必須有一個結(jié)束標(biāo)簽袜硫。

2 可以采用另一種簡化語法氯葬,可以在一個標(biāo)簽中同時表示起始和結(jié)束標(biāo)簽。這種語法是在大于符號之前緊跟一個斜線(/)婉陷,例如溢谤。XML解析器會將其翻譯成瞻凤。

3 標(biāo)簽必須按合適的順序進(jìn)行嵌套,所以結(jié)束標(biāo)簽必須按鏡像順序匹配起始標(biāo)簽世杀,例如this is asamplestring阀参。這好比是將起始和結(jié)束標(biāo)簽看作是數(shù)學(xué)中的左右括號:在沒有關(guān)閉所有的內(nèi)部括號之前,是不能關(guān)閉外面的括號的瞻坝。

4 所有的特性都必須有值蛛壳。

5 所有的特性都必須在值的周圍加上雙引號。

45union u

{

double a;

int b;

};

union u2

{

char a[13];

int b;

};

union u3

{

char a[13];

char b;

};

cout<

cout<

cout<

都知道union的大小取決于它所有的成員中所刀,占用空間最大的一個成員的大小衙荐。所以對于u來說,大小就是最大的double類型成員a了浮创,所以 sizeof(u)=sizeof(double)=8忧吟。但是對于u2和u3,最大的空間都是char[13]類型的數(shù)組斩披,為什么u3的大小是13溜族,而 u2是16呢?關(guān)鍵在于u2中的成員int b垦沉。由于int類型成員的存在煌抒,使u2的對齊方式變成4,也就是說厕倍,u2的大小必須在4的對界上寡壮,所以占用的空間變成了16(最接近13的對界)。?struct s1

{

char a;

double b;

int c;

char d;

};

struct s2

{

char a;

char b;

int c;

double d;

};

cout<

cout<

同樣是兩個char類型讹弯,一個int類型况既,一個double類型,但是因?yàn)閷鐔栴}组民,導(dǎo)致他們的大小不同坏挠。計(jì)算結(jié)構(gòu)體大小可以采用元素?cái)[放法,我舉例子說明一下:首先邪乍,CPU判斷結(jié)構(gòu)體的對界降狠,根據(jù)上一節(jié)的結(jié)論,s1和s2的對界都取最大的元素類型庇楞,也就是double類型的對界8榜配。然后開始擺放每個元素。

對于s1吕晌,首先把a(bǔ)放到8的對界蛋褥,假定是0,此時下一個空閑的地址是1睛驳,但是下一個元素d是double類型烙心,要放到8的對界上膜廊,離1最接近的地址是8了,所以d被放在了8淫茵,此時下一個空閑地址變成了16爪瓜,下一個元素c的對界是4,16可以滿足匙瘪,所以c放在了16铆铆,此時下一個空閑地址變成了20,下一個元素d需要對界1丹喻,也正好落在對界上薄货,所以d放在了20,結(jié)構(gòu)體在地址21處結(jié)束碍论。由于s1的大小需要是8的倍數(shù)谅猾,所以21- 23的空間被保留,s1的大小變成了24鳍悠。

對于s2税娜,首先把a(bǔ)放到8的對界,假定是0贼涩,此時下一個空閑地址是1,下一個元素的對界也是1薯蝎,所以b擺放在1遥倦,下一個空閑地址變成了2;下一個元素c的對界是4占锯,所以取離2最近的地址4擺放c袒哥,下一個空閑地址變成了8,下一個元素d的對界是 8消略,所以d擺放在8堡称,所有元素?cái)[放完畢,結(jié)構(gòu)體在15處結(jié)束艺演,占用總空間為16却紧,正好是8的倍數(shù)。

46ASIDownloadCache設(shè)置下載緩存

它對Get請求的響應(yīng)數(shù)據(jù)進(jìn)行緩存(被緩存的數(shù)據(jù)必需是成功的200請求):

[ASIHTTPRequest setDefaultCache:[ASIDownloadCache sharedCache]];

當(dāng)設(shè)置緩存策略后胎撤,所有的請求都被自動的緩存起來晓殊。

另外,如果僅僅希望某次請求使用緩存操作伤提,也可以這樣使用:

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

[request setDownloadCache:[ASIDownloadCache sharedCache]];

緩存存儲方式

你可以設(shè)置緩存的數(shù)據(jù)需要保存多長時間巫俺,ASIHTTPRequest提供了兩種策略:

a,ASICacheForSessionDurationCacheStoragePolicy肿男,默認(rèn)策略介汹,基于session的緩存數(shù)據(jù)存儲却嗡。當(dāng)下次運(yùn)行或[ASIHTTPRequest clearSession]時,緩存將失效嘹承。

b窗价,ASICachePermanentlyCacheStoragePolicy,把緩存數(shù)據(jù)永久保存在本地赶撰,

如:

ASIHTTPRequest *request = [ ASIHTTPRequest requestWithURL:url ];

[ request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy ];

47HTTP協(xié)議詳解

HTTP是一個屬于應(yīng)用層的面向?qū)ο蟮膮f(xié)議舌镶,由于其簡捷、快速的方式豪娜,適用于分布式超媒體信息系統(tǒng)餐胀。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的規(guī)范化工作正在進(jìn)行之中瘤载。

http(超文本傳輸協(xié)議)是一個基于請求與響應(yīng)模式的否灾、無狀態(tài)的、應(yīng)用層的協(xié)議鸣奔,衬迹基于TCP的連接方式,HTTP1.1版本中給出一種持續(xù)連接的機(jī)制挎狸,絕大多數(shù)的Web開發(fā)扣汪,都是構(gòu)建在HTTP協(xié)議之上的Web應(yīng)用。

HTTP協(xié)議的主要特點(diǎn)可概括如下:

1.支持客戶/服務(wù)器模式锨匆。

2.簡單快速:客戶向服務(wù)器請求服務(wù)時崭别,只需傳送請求方法和路徑。請求方法常用的有GET恐锣、HEAD茅主、POST。每種方法規(guī)定了客戶與服務(wù)器聯(lián)系的類型不同土榴。由于HTTP協(xié)議簡單诀姚,使得HTTP服務(wù)器的程序規(guī)模小,因而通信速度很快玷禽。

3.靈活:HTTP允許傳輸任意類型的數(shù)據(jù)對象赫段。正在傳輸?shù)念愋陀蒀ontent-Type加以標(biāo)記。

4.無連接:無連接的含義是限制每次連接只處理一個請求矢赁。服務(wù)器處理完客戶的請求瑞佩,并收到客戶的應(yīng)答后,即斷開連接坯台。采用這種方式可以節(jié)省傳輸時間炬丸。

5.無狀態(tài):HTTP協(xié)議是無狀態(tài)協(xié)議。無狀態(tài)是指協(xié)議對于事務(wù)處理沒有記憶能力。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息稠炬,則它必須重傳焕阿,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。另一方面首启,在服務(wù)器不需要先前信息時它的應(yīng)答就較快暮屡。

48URL

HTTP URL (URL是一種特殊類型的URI是他的子類,包含了用于查找某個資源的足夠的信息)的格式如下:

http://host[":"port][abs_path]

http表示要通過HTTP協(xié)議來定位網(wǎng)絡(luò)資源毅桃;host表示合法的Internet主機(jī)域名或者IP地址褒纲;port指定一個端口號,為空則使用缺省端口80钥飞;abs_path指定請求資源的URI莺掠;如果URL中沒有給出abs_path,那么當(dāng)它作為請求URI時读宙,必須以“/”的形式給出彻秆,通常這個工作瀏覽器自動幫我們完成。

49TCP/UDP區(qū)別聯(lián)系

TCP---傳輸控制協(xié)議,提供的是面向連接结闸、可靠的字節(jié)流服務(wù)唇兑。當(dāng)客戶和服務(wù)器彼此交換數(shù)據(jù)前,必須先在雙方之間建立一個TCP連接桦锄,之后才能傳輸數(shù)據(jù)扎附。TCP提供超時重發(fā),丟棄重復(fù)數(shù)據(jù)结耀,檢驗(yàn)數(shù)據(jù)留夜,流量控制等功能,保證數(shù)據(jù)能從一端傳到另一端饼记。

UDP---用戶數(shù)據(jù)報(bào)協(xié)議香伴,是一個簡單的面向數(shù)據(jù)報(bào)的運(yùn)輸層協(xié)議慰枕。UDP不提供可靠性具则,它只是把應(yīng)用程序傳給IP層的數(shù)據(jù)報(bào)發(fā)送出去,但是并不能保證它們能到達(dá)目的地具帮。由于UDP在傳輸數(shù)據(jù)報(bào)前不用在客戶和服務(wù)器之間建立一個連接博肋,且沒有超時重發(fā)等機(jī)制,故而傳輸速度很快

TCP(Transmission Control Protocol蜂厅,傳輸控制協(xié)議)是基于連接的協(xié)議匪凡,也就是說,在正式收發(fā)數(shù)據(jù)前掘猿,必須和對方建立可靠的連接病游。一個TCP連接必須要經(jīng)過三次“對話”才能建立起來,我們來看看這三次對話的簡單過程:1.主機(jī)A向主機(jī)B發(fā)出連接請求數(shù)據(jù)包;2.主機(jī)B向主機(jī)A發(fā)送同意連接和要求同步(同步就是兩臺主機(jī)一個在發(fā)送衬衬,一個在接收买猖,協(xié)調(diào)工作)的數(shù)據(jù)包梳杏;3.主機(jī)A再發(fā)出一個數(shù)據(jù)包確認(rèn)主機(jī)B的要求同步:“我現(xiàn)在就發(fā)海洼,你接著吧!”座每,這是第三次對話狮惜。三次“對話”的目的是使數(shù)據(jù)包的發(fā)送和接收同步高诺,經(jīng)過三次“對話”之后,主機(jī)A才向主機(jī)B正式發(fā)送數(shù)據(jù)碾篡。

UDP(User Data Protocol虱而,用戶數(shù)據(jù)報(bào)協(xié)議)是與TCP相對應(yīng)的協(xié)議。它是面向非連接的協(xié)議耽梅,它不與對方建立連接薛窥,而是直接就把數(shù)據(jù)包發(fā)送過去!? UDP適用于一次只傳送少量數(shù)據(jù)眼姐、對可靠性要求不高的應(yīng)用環(huán)境诅迷。

tcp協(xié)議和udp協(xié)議的差別

是否連接面向連接面向非連接

傳輸可靠性可靠不可靠

應(yīng)用場合傳輸大量數(shù)據(jù)少量數(shù)據(jù)

速度慢快

50史上最全的iOS面試題及答案socket連接和http連接的區(qū)別

簡單說,你瀏覽的網(wǎng)頁(網(wǎng)址以http://開頭)都是http協(xié)議傳輸?shù)侥愕臑g覽器的, 而http是基于socket之上的众旗。socket是一套完成tcp罢杉,udp協(xié)議的接口。

HTTP協(xié)議:簡單對象訪問協(xié)議贡歧,對應(yīng)于應(yīng)用層??滩租,HTTP協(xié)議是基于TCP連接的

tcp協(xié)議:??? 對應(yīng)于傳輸層

ip協(xié)議:???? 對應(yīng)于網(wǎng)絡(luò)層

TCP/IP是傳輸層協(xié)議,主要解決數(shù)據(jù)如何在網(wǎng)絡(luò)中傳輸利朵;而HTTP是應(yīng)用層協(xié)議律想,主要解決如何包裝數(shù)據(jù)。

Socket是對TCP/IP協(xié)議的封裝绍弟,Socket本身并不是協(xié)議技即,而是一個調(diào)用接口(API),通過Socket樟遣,我們才能使用TCP/IP協(xié)議而叼。

http連接:http連接就是所謂的短連接,即客戶端向服務(wù)器端發(fā)送一次請求豹悬,服務(wù)器端響應(yīng)后連接即會斷掉葵陵;

socket連接:socket連接就是所謂的長連接,理論上客戶端和服務(wù)器端一旦建立起連接將不會主動斷掉瞻佛;但是由于各種環(huán)境因素可能會是連接斷開脱篙,比如說:服務(wù)器端或客戶端主機(jī)down了,網(wǎng)絡(luò)故障,或者兩者之間長時間沒有數(shù)據(jù)傳輸绊困,網(wǎng)絡(luò)防火墻可能會斷開該連接以釋放網(wǎng)絡(luò)資源忍弛。所以當(dāng)一個socket連接中沒有數(shù)據(jù)的傳輸,那么為了維持連接需要發(fā)送心跳消息~~具體心跳消息格式是開發(fā)者自己定義的

我們已經(jīng)知道網(wǎng)絡(luò)中的進(jìn)程是通過socket來通信的考抄,那什么是socket呢细疚?socket起源于Unix,而Unix/Linux基本哲學(xué)之一就是“一切皆文件”川梅,都可以用“打開open –> 讀寫write/read –> 關(guān)閉close”模式來操作疯兼。我的理解就是Socket就是該模式的一個實(shí)現(xiàn),socket即是一種特殊的文件贫途,一些socket函數(shù)就是對其進(jìn)行的操作(讀/寫IO吧彪、打開、關(guān)閉)丢早,這些函數(shù)我們在后面進(jìn)行介紹姨裸。我們在傳輸數(shù)據(jù)時,可以只使用(傳輸層)TCP/IP協(xié)議怨酝,但是那樣的話傀缩,如果沒有應(yīng)用層,便無法識別數(shù)據(jù)內(nèi)容农猬,如果想要使傳輸?shù)臄?shù)據(jù)有意義赡艰,則必須使用到應(yīng)用層協(xié)議,應(yīng)用層協(xié)議有很多斤葱,比如HTTP慷垮、FTP、TELNET等揍堕,也可以自己定義應(yīng)用層協(xié)議料身。WEB使用HTTP協(xié)議作應(yīng)用層協(xié)議,以封裝HTTP文本信息衩茸,然后使用TCP/IP做傳輸層協(xié)議將它發(fā)到網(wǎng)絡(luò)上芹血。

1)Socket是一個針對TCP和UDP編程的接口,你可以借助它建立TCP連接等等递瑰。而TCP和UDP協(xié)議屬于傳輸層?祟牲。

而http是個應(yīng)用層的協(xié)議隙畜,它實(shí)際上也建立在TCP協(xié)議之上抖部。

(HTTP是轎車,提供了封裝或者顯示數(shù)據(jù)的具體形式议惰;Socket是發(fā)動機(jī)慎颗,提供了網(wǎng)絡(luò)通信的能力。)

2)Socket是對TCP/IP協(xié)議的封裝,Socket本身并不是協(xié)議俯萎,而是一個調(diào)用接口(API)傲宜,通過Socket,我們才能使用TCP/IP協(xié)議夫啊。Socket的出現(xiàn)只是使得程序員更方便地使用TCP/IP協(xié)議棧而已函卒,是對TCP/IP協(xié)議的抽象,從而形成了我們知道的一些最基本的函數(shù)接口撇眯。

51什么是TCP連接的三次握手

第一次握手:客戶端發(fā)送syn包(syn=j)到服務(wù)器报嵌,并進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器確認(rèn)熊榛;

第二次握手:服務(wù)器收到syn包锚国,必須確認(rèn)客戶的SYN(ack=j+1),同時自己也發(fā)送一個SYN包(syn=k)玄坦,即SYN+ACK包血筑,此時服務(wù)器進(jìn)入SYN_RECV狀態(tài);

第三次握手:客戶端收到服務(wù)器的SYN+ACK包煎楣,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1)豺总,此包發(fā)送完畢,客戶端和服務(wù)器進(jìn)入ESTABLISHED狀態(tài)择懂,完成三次握手园欣。

握手過程中傳送的包里不包含數(shù)據(jù),三次握手完畢后休蟹,客戶端與服務(wù)器才正式開始傳送數(shù)據(jù)沸枯。理想狀態(tài)下,TCP連接一旦建立赂弓,在通信雙方中的任何一方主動關(guān)閉連接之前绑榴,TCP 連接都將被一直保持下去。斷開連接時服務(wù)器和客戶端均可以主動發(fā)起斷開TCP連接的請求盈魁,斷開過程需要經(jīng)過“四次握手”(過程就不細(xì)寫了翔怎,就是服務(wù)器和客戶端交互,最終確定斷開)

52利用Socket建立網(wǎng)絡(luò)連接的步驟

建立Socket連接至少需要一對套接字杨耙,其中一個運(yùn)行于客戶端赤套,稱為ClientSocket ,另一個運(yùn)行于服務(wù)器端珊膜,稱為ServerSocket 容握。

套接字之間的連接過程分為三個步驟:服務(wù)器監(jiān)聽,客戶端請求车柠,連接確認(rèn)剔氏。

1塑猖。服務(wù)器監(jiān)聽:服務(wù)器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態(tài)谈跛,實(shí)時監(jiān)控網(wǎng)絡(luò)狀態(tài)羊苟,等待客戶端的連接請求。

2感憾±客戶端請求:指客戶端的套接字提出連接請求,要連接的目標(biāo)是服務(wù)器端的套接字阻桅。為此巍虫,客戶端的套接字必須首先描述它要連接的服務(wù)器的套接字,指出服務(wù)器端套接字的地址和端口號鳍刷,然后就向服務(wù)器端套接字提出連接請求占遥。

3。連接確認(rèn):當(dāng)服務(wù)器端套接字監(jiān)聽到或者說接收到客戶端套接字的連接請求時输瓜,就響應(yīng)客戶端套接字的請求瓦胎,建立一個新的線程,把服務(wù)器端套接字的描述發(fā)給客戶端尤揣,一旦客戶端確認(rèn)了此描述搔啊,雙方就正式建立連接。而服務(wù)器端套接字繼續(xù)處于監(jiān)聽狀態(tài)北戏,繼續(xù)接收其他客戶端套接字的連接請求负芋。

53進(jìn)程與線程

進(jìn)程(process)是一塊包含了某些資源的內(nèi)存區(qū)域。操作系統(tǒng)利用進(jìn)程把它的工作劃分為一些功能單元嗜愈。

進(jìn)程中所包含的一個或多個執(zhí)行單元稱為線程(thread)旧蛾。進(jìn)程還擁有一個私有的虛擬地址空間,該空間僅能被它所包含的線程訪問蠕嫁。

通常在一個進(jìn)程中可以包含若干個線程锨天,它們可以利用進(jìn)程所擁有的資源。

在引入線程的操作系統(tǒng)中剃毒,通常都是把進(jìn)程作為分配資源的基本單位病袄,而把線程作為獨(dú)立運(yùn)行和獨(dú)立調(diào)度的基本單位。

由于線程比進(jìn)程更小赘阀,基本上不擁有系統(tǒng)資源益缠,故對它的調(diào)度所付出的開銷就會小得多,能更高效的提高系統(tǒng)內(nèi)多個程序間并發(fā)執(zhí)行的程度基公。

簡而言之,一個程序至少有一個進(jìn)程,一個進(jìn)程至少有一個線程.一個程序就是一個進(jìn)程幅慌,而一個程序中的多個任務(wù)則被稱為線程。

線程只能歸屬于一個進(jìn)程并且它只能訪問該進(jìn)程所擁有的資源酌媒。當(dāng)操作系統(tǒng)創(chuàng)建一個進(jìn)程后欠痴,該進(jìn)程會自動申請一個名為主線程或首要線程的線程。應(yīng)用程序(application)是由一個或多個相互協(xié)作的進(jìn)程組成的秒咨。

另外喇辽,進(jìn)程在執(zhí)行過程中擁有獨(dú)立的內(nèi)存單元,而多個線程共享內(nèi)存雨席,從而極大地提高了程序的運(yùn)行效率菩咨。

線程在執(zhí)行過程中與進(jìn)程還是有區(qū)別的。每個獨(dú)立的線程有一個程序運(yùn)行的入口陡厘、順序執(zhí)行序列和程序的出口抽米。但是線程不能夠獨(dú)立執(zhí)行,必須依存在應(yīng)用程序中糙置,由應(yīng)用程序提供多個線程執(zhí)行控制云茸。

從邏輯角度來看,多線程的意義在于一個應(yīng)用程序中谤饭,有多個執(zhí)行部分可以同時執(zhí)行标捺。但操作系統(tǒng)并沒有將多個線程看做多個獨(dú)立的應(yīng)用,來實(shí)現(xiàn)進(jìn)程的調(diào)度和管理以及資源分配揉抵。這就是進(jìn)程和線程的重要區(qū)別亡容。

進(jìn)程是具有一定獨(dú)立功能的程序關(guān)于某個數(shù)據(jù)集合上的一次運(yùn)行活動,進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個獨(dú)立單位.

線程是進(jìn)程的一個實(shí)體,是CPU調(diào)度和分派的基本單位,它是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位.線程自己基本上不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源(如程序計(jì)數(shù)器,一組寄存器和棧),但是它可與同屬一個進(jìn)程的其他的線程共享進(jìn)程所擁有的全部資源.

一個線程可以創(chuàng)建和撤銷另一個線程;同一個進(jìn)程中的多個線程之間可以并發(fā)執(zhí)行.

54多線程

多線程編程是防止主線程堵塞,增加運(yùn)行效率等等的最佳方法冤今。而原始的多線程方法存在很多的毛病闺兢,包括線程鎖死等。在Cocoa中戏罢,Apple提供了NSOperation這個類屋谭,提供了一個優(yōu)秀的多線程編程方法。

本次介紹NSOperation的子集龟糕,簡易方法的NSInvocationOperation:

一個NSOperationQueue 操作隊(duì)列戴而,就相當(dāng)于一個線程管理器,而非一個線程翩蘸。因?yàn)槟憧梢栽O(shè)置這個線程管理器內(nèi)可以并行運(yùn)行的的線程數(shù)量等等

55oc語法里的@perpoerty不用寫@synzhesize了所意,自動填充了。并且的_name;

寫方法時候不用提前聲明催首。llvm 全局方法便利扶踊。

枚舉類型。enum hello:Integer{? } 冒號后面直接可以跟類型郎任,以前是:

enum hello{} 后面在指定為Integer .

橋接秧耗。ARC 自動release retain 的時候 CFString CFArray . Core Fountion. 加上橋接_brige? 才能區(qū)分CFString 和NSString 而現(xiàn)在自動區(qū)分了,叫固定橋接舶治。

下拉刷新封裝好了分井。

UICollectionViewController. 可以把表格分成多列车猬。

Social Framework(社交集成)

UIActivityViewController來詢問用戶的社交行為

緩存:就是存放在臨時文件里,比如新浪微博請求的數(shù)據(jù)尺锚,和圖片珠闰,下次請求看這里有沒有值。

56Singleton(單例模式)瘫辩,也叫單子模式伏嗜,是一種常用的軟件設(shè)計(jì)模式。在應(yīng)用這個模式時伐厌,單例對象的類必須保證只有一個實(shí)例存在承绸。

代碼如下:

static ClassA *classA = nil;//靜態(tài)的該類的實(shí)例

+ (ClassA *)sharedManager

@synchronized(self) {

if (!classA) {

classA = [[super allocWithZone:NULL]init];

}

return classA;

}

+ (id)allocWithZone:(NSZone *)zone {

return [[self sharedManager] retain];

}

- (id)copyWithZone:(NSZone *)zone {

return self;

}

- (id)retain {

return self;

}

- (NSUIntger)retainCount {

return NSUIntgerMax;

}

- (oneway void)release {

}

- (id)autorelease {

return self;

}

-(void)dealloc{

}

57請寫一個C函數(shù)挣轨,若處理器是Big_endian的军熏,則返回0;若是Little_endian的卷扮,則返回1 int checkCPU( ) {

{

union w

{

int a;

char b;

} c;

c.a = 1;

return? (c.b ==1);

}

}

剖析:嵌入式系統(tǒng)開發(fā)者應(yīng)該對Little-endian和Big-endian模式非常了解羞迷。采用Little-endian模式的CPU對操作數(shù)的存放方式是從低字節(jié)到高字節(jié), Big-endian? 模式的CPU對操作數(shù)的存放方式是從高字節(jié)到低字節(jié)画饥。在弄清楚這個之前要弄清楚這個問題:字節(jié)從右到坐為從高到低! 假設(shè)從地址0x4000開始存放: 0x12345678,是也個32位四個字節(jié)的數(shù)據(jù)衔瓮,最高字節(jié)是0x12,最低字節(jié)是0x78:在Little-endian模式CPU內(nèi)存中的存放方式為: (高字節(jié)在高地址, 低字節(jié)在低地址)

內(nèi)存地址0x4000 0x4001 0x4002 0x4003

存放內(nèi)容 0x78 0x56 0x34 0x12

大端機(jī)則相反。

有的處理器系統(tǒng)采用了小端方式進(jìn)行數(shù)據(jù)存放抖甘,如Intel的奔騰热鞍。有的處理器系統(tǒng)采用了大端方式進(jìn)行數(shù)據(jù)存放,如IBM半導(dǎo)體和Freescale的PowerPC處理器衔彻。不僅對于處理器薇宠,一些外設(shè)的設(shè)計(jì)中也存在著使用大端或者小端進(jìn)行數(shù)據(jù)存放的選擇。因此在一個處理器系統(tǒng)中艰额,有可能存在大端和小端模式同時存在的現(xiàn)象澄港。這一現(xiàn)象為系統(tǒng)的軟硬件設(shè)計(jì)帶來了不小的麻煩,這要求系統(tǒng)設(shè)計(jì)工程師柄沮,必須深入理解大端和小端模式的差別回梧。大端與小端模式的差別體現(xiàn)在一個處理器的寄存器,指令集祖搓,系統(tǒng)總線等各個層次中狱意。?? 聯(lián)合體union的存放順序是所有成員都從低地址開始存放的。以上是網(wǎng)上的原文拯欧。讓我們看看在ARM處理器上union是如何存儲的呢??? 地址A ---------------- |A???? |A+1?? |A+2?? |A+3??? |int a; |????? |???????? |???????? |????????? -------------------- |A???? |char b; |????? | ---------??????????????????????????????????????????????????????????????????????????? 如果是小端如何存儲c.a的呢详囤?

地址A -----------

------------------- |A??? |A+1?? |A+2??? |A+3 | int a;

|0x01 |0x00?? |0x00?? |0x00 | ------------------------------------- |A??? |char b; |???? | ---------

如果是大端如何存儲c.a的呢?

地址A ---------------------

--------- |A????? |A+1??? |A+2???? |A+3???? |int a; |0x00?? |0x00?? |0x00??? |0x01??? | ------------------------------------------ |A????? |char b; |?????? | ---------??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 現(xiàn)在知道為什么c.b==0的話是大端镐作,c.b==1的話就是小端了吧藏姐。

58

堆和棧上的指針

指針?biāo)赶虻倪@塊內(nèi)存是在哪里分配的,在堆上稱為堆上的指針,在棧上為棧上的指針.

在堆上的指針,可以保存在全局?jǐn)?shù)據(jù)結(jié)構(gòu)中,供不同函數(shù)使用訪問同一塊內(nèi)存.

在棧上的指針,在函數(shù)退出后,該內(nèi)存即不可訪問.

59什么是指針的釋放?

具體來說包括兩個概念.

1 釋放該指針指向的內(nèi)存,只有堆上的內(nèi)存才需要我們手工釋放,棧上不需要.

2 將該指針重定向?yàn)镹ULL.

60數(shù)據(jù)結(jié)構(gòu)中的指針?

其實(shí)就是指向一塊內(nèi)存的地址,通過指針傳遞,可實(shí)現(xiàn)復(fù)雜的內(nèi)存訪問.

7 函數(shù)指針?

指向一塊函數(shù)的入口地址.

8 指針作為函數(shù)的參數(shù)?

比如指向一個復(fù)雜數(shù)據(jù)結(jié)構(gòu)的指針作為函數(shù)變量

這種方法避免整個復(fù)雜數(shù)據(jù)類型內(nèi)存的壓棧出棧操作,提高效率.

注意:指針本身不可變,但指針指向的數(shù)據(jù)結(jié)構(gòu)可以改變.

9 指向指針的指針?

指針指向的變量是一個指針,即具體內(nèi)容為一個指針的值,是一個地址.

此時指針指向的變量長度也是4位.

61指針與地址的區(qū)別?

區(qū)別:

1指針意味著已經(jīng)有一個指針變量存在,他的值是一個地址,指針變量本身也存放在一個長度為四個字節(jié)的地址當(dāng)中,而地址概念本身并不代表有任何變量存在.

2 指針的值,如果沒有限制,通常是可以變化的,也可以指向另外一個地址.

地址表示內(nèi)存空間的一個位置點(diǎn),他是用來賦給指針的,地址本身是沒有大小概念,指針指向變量的大小,取決于地址后面存放的變量類型.

62指針與數(shù)組名的關(guān)系?

其值都是一個地址,但前者是可以移動的,后者是不可變的.

12 怎樣防止指針的越界使用問題?

必須讓指針指向一個有效的內(nèi)存地址,

1 防止數(shù)組越界

2 防止向一塊內(nèi)存中拷貝過多的內(nèi)容

3 防止使用空指針

4 防止改變const修改的指針

5 防止改變指向靜態(tài)存儲區(qū)的內(nèi)容

6 防止兩次釋放一個指針

7 防止使用野指針.

13 指針的類型轉(zhuǎn)換?

指針轉(zhuǎn)換通常是指針類型和void * 類型之前進(jìn)行強(qiáng)制轉(zhuǎn)換,從而與期望或返回void指針的函數(shù)進(jìn)行正確的交接.

63static有什么用途隆箩?(請至少說明兩種)

1.限制變量的作用域

2.設(shè)置變量的存儲域

7. 引用與指針有什么區(qū)別?

1) 引用必須被初始化羔杨,指針不必捌臊。

2) 引用初始化以后不能被改變,指針可以改變所指的對象问畅。

2) 不存在指向空值的引用娃属,但是存在指向空值的指針六荒。

8. 描述實(shí)時系統(tǒng)的基本特性

在特定時間內(nèi)完成特定的任務(wù)护姆,實(shí)時性與可靠性

64全局變量和局部變量在內(nèi)存中是否有區(qū)別?如果有掏击,是什么區(qū)別卵皂?

全局變量儲存在靜態(tài)數(shù)據(jù)庫,局部變量在堆棧

10. 什么是平衡二叉樹砚亭?

左右子樹都是平衡二叉樹且左右子樹的深度差值的絕對值不大于1

65堆棧溢出一般是由什么原因?qū)е碌模?/p>

沒有回收垃圾資源

12. 什么函數(shù)不能聲明為虛函數(shù)灯变?

constructor

13. 冒泡排序算法的時間復(fù)雜度是什么?

O(n^2)

14. 寫出float x 與“零值”比較的if語句捅膘。

if(x>0.000001&&x<-0.000001)

16. Internet采用哪種網(wǎng)絡(luò)協(xié)議添祸?該協(xié)議的主要層次結(jié)構(gòu)?

tcp/ip 應(yīng)用層/傳輸層/網(wǎng)絡(luò)層/數(shù)據(jù)鏈路層/物理層

17. Internet物理地址和IP地址轉(zhuǎn)換采用什么協(xié)議寻仗?

ARP (Address Resolution Protocol)(地址解析協(xié)議)

18.IP地址的編碼分為哪倆部分刃泌?

IP地址由兩部分組成,網(wǎng)絡(luò)號和主機(jī)號署尤。不過是要和“子網(wǎng)掩碼”按位與上之后才能區(qū)

分哪些是網(wǎng)絡(luò)位哪些是主機(jī)位耙替。

2.用戶輸入M,N值,從1至N開始順序循環(huán)數(shù)數(shù)曹体,每數(shù)到M輸出該數(shù)值俗扇,直至全部輸出。寫

出C程序箕别。

循環(huán)鏈表铜幽,用取余操作做

3.不能做switch()的參數(shù)類型是:

switch的參數(shù)不能為實(shí)型。

華為

1串稀、局部變量能否和全局變量重名啥酱?

答:能,局部會屏蔽全局厨诸。要用全局變量镶殷,需要使用"::"

局部變量可以與全局變量同名,在函數(shù)內(nèi)引用這個變量時微酬,會用到同名的局部變量绘趋,而

不會用到全局變量颤陶。對于有些編譯器而言,在同一個函數(shù)內(nèi)可以定義多個同名的局部變

量陷遮,比如在兩個循環(huán)體內(nèi)都定義一個同名的局部變量滓走,而那個局部變量的作用域就在那

個循環(huán)體內(nèi)

2、如何引用一個已經(jīng)定義過的全局變量帽馋?

答:extern

可以用引用頭文件的方式搅方,也可以用extern關(guān)鍵字,如果用引用頭文件方式來引用某個

在頭文件中聲明的全局變理绽族,假定你將那個變寫錯了姨涡,那么在編譯期間會報(bào)錯,如果你

用extern方式引用時吧慢,假定你犯了同樣的錯誤涛漂,那么在編譯期間不會報(bào)錯,而在連接期

間報(bào)錯

3检诗、全局變量可不可以定義在可被多個.C文件包含的頭文件中匈仗?為什么?

答:可以逢慌,在不同的C文件中以static形式來聲明同名全局變量悠轩。

可以在不同的C文件中聲明同名的全局變量,前提是其中只能有一個C文件中對此變量賦

初值攻泼,此時連接不會出錯

4火架、語句for( ;1 坠韩;)有什么問題距潘?它是什么意思?

答:和while(1)相同只搁。

5音比、do……while和while……do有什么區(qū)別?

答:前一個循環(huán)一遍再判斷氢惋,后一個判斷以后再循環(huán)

661.IP Phone的原理是什么?

IPV6

2.TCP/IP通信建立的過程怎樣洞翩,端口有什么作用?

三次握手焰望,確定是哪個應(yīng)用程序使用該協(xié)議

3.1號信令和7號信令有什么區(qū)別骚亿,我國某前廣泛使用的是那一種?

4.列舉5種以上的電話新業(yè)務(wù)熊赖?

微軟亞洲技術(shù)中心的面試題@赐馈!!

1.進(jìn)程和線程的差別俱笛。

線程是指進(jìn)程內(nèi)的一個執(zhí)行單元,也是進(jìn)程內(nèi)的可調(diào)度實(shí)體.

與進(jìn)程的區(qū)別:

(1)調(diào)度:線程作為調(diào)度和分配的基本單位捆姜,進(jìn)程作為擁有資源的基本單位

(2)并發(fā)性:不僅進(jìn)程之間可以并發(fā)執(zhí)行,同一個進(jìn)程的多個線程之間也可并發(fā)執(zhí)行

(3)擁有資源:進(jìn)程是擁有資源的一個獨(dú)立單位迎膜,線程不擁有系統(tǒng)資源泥技,但可以訪問隸屬

于進(jìn)程的資源.

(4)系統(tǒng)開銷:在創(chuàng)建或撤消進(jìn)程時,由于系統(tǒng)都要為之分配和回收資源磕仅,導(dǎo)致系統(tǒng)的開

銷明顯大于創(chuàng)建或撤消線程時的開銷珊豹。

2.測試方法

人工測試:個人復(fù)查、抽查和會審

機(jī)器測試:黑盒測試和白盒測試

2.Heap與stack的差別榕订。

Heap是堆店茶,stack是棧。

Stack的空間由操作系統(tǒng)自動分配/釋放卸亮,Heap上的空間手動分配/釋放忽妒。

Stack空間有限玩裙,Heap是很大的自由存儲區(qū)

C中的malloc函數(shù)分配的內(nèi)存空間即在堆上,C++中對應(yīng)的是new操作符兼贸。

程序在編譯期對變量和函數(shù)分配內(nèi)存都在棧上進(jìn)行,且程序運(yùn)行過程中函數(shù)調(diào)用時參數(shù)的

傳遞也在棧上進(jìn)行

3.Windows下的內(nèi)存是如何管理的?

4.介紹.Net和.Net的安全性吃溅。

5.客戶端如何訪問.Net組件實(shí)現(xiàn)Web Service溶诞?

6.C/C++編譯器中虛表是如何完成的?

7.談?wù)凜OM的線程模型决侈。然后討論進(jìn)程內(nèi)/外組件的差別螺垢。

8.談?wù)処A32下的分頁機(jī)制

小頁(4K)兩級分頁模式,大頁(4M)一級

9.給兩個變量赖歌,如何找出一個帶環(huán)單鏈表中是什么地方出現(xiàn)環(huán)的枉圃?

一個遞增一,一個遞增二庐冯,他們指向同一個接點(diǎn)時就是環(huán)出現(xiàn)的地方

10.在IA32中一共有多少種辦法從用戶態(tài)跳到內(nèi)核態(tài)孽亲?

通過調(diào)用門,從ring3到ring0展父,中斷從ring3到ring0返劲,進(jìn)入vm86等等

11.如果只想讓程序有一個實(shí)例運(yùn)行,不能運(yùn)行兩個栖茉。像winamp一樣预皇,只能開一個窗

口俊柔,怎樣實(shí)現(xiàn)?

用內(nèi)存映射或全局原子(互斥變量)、查找窗口句柄..

FindWindow治唤,互斥泽裳,寫標(biāo)志到文件或注冊表,共享內(nèi)存。

67如何截取鍵盤的響應(yīng),讓所有的‘a(chǎn)’變成‘b’菩收?

鍵盤鉤子SetWindowsHookEx

13.Apartment在COM中有什么用?為什么要引入鲸睛?

14.存儲過程是什么娜饵?有什么用?有什么優(yōu)點(diǎn)官辈?

我的理解就是一堆sql的集合箱舞,可以建立非常復(fù)雜的查詢,編譯運(yùn)行拳亿,所以運(yùn)行一次后晴股,

以后再運(yùn)行速度比單獨(dú)執(zhí)行SQL快很多

15.Template有什么特點(diǎn)?什么時候用肺魁?

16.談?wù)刉indows DNA結(jié)構(gòu)的特點(diǎn)和優(yōu)點(diǎn)电湘。

網(wǎng)絡(luò)編程中設(shè)計(jì)并發(fā)服務(wù)器,使用多進(jìn)程與多線程鹅经,請問有什么區(qū)別寂呛?

1,進(jìn)程:子進(jìn)程是父進(jìn)程的復(fù)制品瘾晃。子進(jìn)程獲得父進(jìn)程數(shù)據(jù)空間贷痪、堆和棧的復(fù)制品。

2蹦误,線程:相對與進(jìn)程而言劫拢,線程是一個更加接近與執(zhí)行體的概念,它可以與同進(jìn)程的其

他線程共享數(shù)據(jù)强胰,但擁有自己的棽詹祝空間,擁有獨(dú)立的執(zhí)行序列偶洋。

兩者都可以提高程序的并發(fā)度熟吏,提高程序運(yùn)行效率和響應(yīng)時間。

線程和進(jìn)程在使用上各有優(yōu)缺點(diǎn):線程執(zhí)行開銷小涡真,但不利于資源管理和保護(hù)分俯;而進(jìn)程

正相反。同時哆料,線程適合于在SMP機(jī)器上運(yùn)行缸剪,而進(jìn)程則可以跨機(jī)器遷移。

思科

682.找錯題

試題1:

void test1()

{

char string[10];

char* str1 = "0123456789";

strcpy( string, str1 );

}

試題2:

void test2()

{

char string[10], str1[10];

int i;

for(i=0; i<10; i++)

{

str1= 'a';

}

strcpy( string, str1 );

}

試題3:

void test3(char* str1)

{

char string[10];

if( strlen( str1 ) <= 10 )

{

strcpy( string, str1 );

}

}

解答:

試題1字符串str1需要11個字節(jié)才能存放下(包括末尾的’\0’)东亦,而string只有10個字節(jié)的空間杏节,strcpy會導(dǎo)致數(shù)組越界唬渗;

對試題2,如果面試者指出字符數(shù)組str1不能在數(shù)組內(nèi)結(jié)束可以給3分奋渔;如果面試者指出strcpy(string, str1)調(diào)用使得從str1[url=]內(nèi)存[/url]起復(fù)制到string內(nèi)存起所復(fù)制的字節(jié)數(shù)具有不確定性可以給7分镊逝,在此基礎(chǔ)上指出庫函數(shù)strcpy工作方式的給10分;

對試題3嫉鲸,if(strlen(str1) <= 10)應(yīng)改為if(strlen(str1) < 10)撑蒜,因?yàn)閟trlen的結(jié)果未統(tǒng)計(jì)’\0’所占用的1個字節(jié)。

剖析:

考查對基本功的掌握:

(1)字符串以’\0’結(jié)尾玄渗;

(2)對數(shù)組越界把握的敏感度座菠;

(3)庫函數(shù)strcpy的工作方式,如果編寫一個標(biāo)準(zhǔn)strcpy函數(shù)的總分值為10藤树,下面給出幾個不同得分的答案:

2分

void strcpy( char *strDest, char *strSrc )

{

while( (*strDest++ = * strSrc++) != ‘\0’ );

}

4分

void strcpy( char *strDest, const char *strSrc )

//將源字符串加const浴滴,表明其為輸入?yún)?shù),加2分

{

while( (*strDest++ = * strSrc++) != ‘\0’ );

}

7分

void strcpy(char *strDest, const char *strSrc)

{

//對源地址和目的地址加非0斷言岁钓,加3分

assert( (strDest != NULL) && (strSrc != NULL) );

while( (*strDest++ = * strSrc++) != ‘\0’ );

}

10分

//為了實(shí)現(xiàn)鏈?zhǔn)讲僮魃裕瑢⒛康牡刂贩祷兀?分屡限!

char * strcpy( char *strDest, const char *strSrc )

{

assert( (strDest != NULL) && (strSrc != NULL) );

char *address = strDest;

while( (*strDest++ = * strSrc++) != ‘\0’ );

return address;

}

從2分到10分的幾個答案我們可以清楚的看到品嚣,小小的strcpy竟然暗藏著這么多玄機(jī),真不是蓋的囚霸!需要多么扎實(shí)的基本功才能寫一個完美的strcpy把激才!

(4)對strlen的掌握拓型,它沒有包括字符串末尾的'\0'。

讀者看了不同分值的strcpy版本瘸恼,應(yīng)該也可以寫出一個10分的strlen函數(shù)了劣挫,完美的版本為: int strlen( const char *str ) //輸入?yún)?shù)const

{

assert( strt != NULL ); //斷言字符串地址非0

int len;

while( (*str++) != '\0' )

{

len++;

}

return len;

}

試題4:

void GetMemory( char *p )

{

p = (char *) malloc( 100 );

}

void Test( void )

{

char *str = NULL;

GetMemory( str );

strcpy( str, "hello world" );

printf( str );

}

試題5:

char *GetMemory( void )

{

char p[] = "hello world";

return p;

}

void Test( void )

{

char *str = NULL;

str = GetMemory();

printf( str );

}

試題6:

void GetMemory( char **p, int num )

{

*p = (char *) malloc( num );

}

void Test( void )

{

char *str = NULL;

GetMemory( &str, 100 );

strcpy( str, "hello" );

printf( str );

}

試題7:

void Test( void )

{

char *str = (char *) malloc( 100 );

strcpy( str, "hello" );

free( str );

... //省略的其它語句

}

解答:

試題4傳入中GetMemory( char *p )函數(shù)的形參為字符串指針,在函數(shù)內(nèi)部修改形參并不能真正的改變傳入形參的值东帅,執(zhí)行完

char *str = NULL;

GetMemory( str );

后的str仍然為NULL压固;

試題5中

char p[] = "hello world";

return p;

的p[]數(shù)組為函數(shù)內(nèi)的局部自動變量,在函數(shù)返回后靠闭,內(nèi)存已經(jīng)被釋放帐我。這是許多程序員常犯的錯誤,其根源在于不理解變量的生存期愧膀。

試題6的GetMemory避免了試題4的問題拦键,傳入GetMemory的參數(shù)為字符串指針的指針,但是在GetMemory中執(zhí)行申請內(nèi)存及賦值語句

*p = (char *) malloc( num );

后未判斷內(nèi)存是否申請成功檩淋,應(yīng)加上:

if ( *p == NULL )

{

...//進(jìn)行申請內(nèi)存失敗處理

}

試題7存在與試題6同樣的問題芬为,在執(zhí)行

char *str = (char *) malloc(100);

后未進(jìn)行內(nèi)存是否申請成功的判斷;另外,在free(str)后未置str為空媚朦,導(dǎo)致可能變成一個“野”指針氧敢,應(yīng)加上:

str = NULL;

試題6的Test函數(shù)中也未對malloc的內(nèi)存進(jìn)行釋放。

剖析:

試題4~7考查面試者對內(nèi)存操作的理解程度询张,基本功扎實(shí)的面試者一般都能正確的回答其中50~60的錯誤孙乖。但是要完全解答正確,卻也絕非易事份氧。

對內(nèi)存操作的考查主要集中在:

(1)指針的理解的圆;

(2)變量的生存期及作用范圍;

(3)良好的動態(tài)內(nèi)存申請和釋放習(xí)慣半火。

再看看下面的一段程序有什么錯誤:

swap( int* p1,int* p2 )

{

int *p;

*p = *p1;

*p1 = *p2;

*p2 = *p;

}

在swap函數(shù)中越妈,p是一個“野”指針,有可能指向系統(tǒng)區(qū)钮糖,導(dǎo)致程序運(yùn)行的崩潰梅掠。在VC++中DEBUG運(yùn)行時提示錯誤“Access Violation”。該程序應(yīng)該改為:

swap( int* p1,int* p2 )

{

int p;

p = *p1;

*p1 = *p2;

*p2 = p;

}[img=12,12]file:///D:/魚魚軟件/魚魚多媒體日記本/temp/{56068A28-3D3B-4D8B-9F82-AC1C3E9B128C}_arc_d[1].gif[/img]3.內(nèi)功題

試題1:分別給出BOOL店归,int阎抒,float,指針變量 與“零值”比較的 if 語句(假設(shè)變量名為var)

解答:

BOOL型變量:if(!var)

int型變量: if(var==0)

float型變量:

const float EPSINON = 0.00001;

if ((x >= - EPSINON) && (x <= EPSINON)

指針變量:  if(var==NULL)

剖析:

考查對0值判斷的“內(nèi)功”消痛,BOOL型變量的0判斷完全可以寫成if(var==0)且叁,而int型變量也可以寫成if(!var),指針變量的判斷也可以寫成if(!var)秩伞,上述寫法雖然程序都能正確運(yùn)行逞带,但是未能清晰地表達(dá)程序的意思。

一般的纱新,如果想讓if判斷一個變量的“真”展氓、“假”,應(yīng)直接使用if(var)脸爱、if(!var)遇汞,表明其為“邏輯”判斷;如果用if判斷一個數(shù)值型變量(short簿废、int空入、long等),應(yīng)該用if(var==0)族檬,表明是與0進(jìn)行“數(shù)值”上的比較歪赢;而判斷指針則適宜用if(var==NULL),這是一種很好的編程習(xí)慣导梆。

浮點(diǎn)型變量并不精確轨淌,所以不可將float變量用“==”或“迂烁!=”與數(shù)字比較,應(yīng)該設(shè)法轉(zhuǎn)化成“>=”或“<=”形式递鹉。如果寫成if (x == 0.0)盟步,則判為錯,得0分躏结。

試題2:以下為Windows NT下的32位C++程序却盘,請計(jì)算sizeof的值

void Func ( char str[100] )

{

sizeof( str ) = ?

}

void *p = malloc( 100 );

sizeof ( p ) = ?

解答:

sizeof( str ) = 4

sizeof ( p ) = 4

剖析:

Func ( char str[100] )函數(shù)中數(shù)組名作為函數(shù)形參時,在函數(shù)體內(nèi)媳拴,數(shù)組名失去了本身的內(nèi)涵黄橘,僅僅只是一個指針;在失去其內(nèi)涵的同時屈溉,它還失去了其常量特性塞关,可以作自增、自減等操作子巾,可以被修改帆赢。

數(shù)組名的本質(zhì)如下:

(1)數(shù)組名指代一種數(shù)據(jù)結(jié)構(gòu),這種數(shù)據(jù)結(jié)構(gòu)就是數(shù)組线梗;

例如:

char str[10];

cout << sizeof(str) << endl;

輸出結(jié)果為10椰于,str指代數(shù)據(jù)結(jié)構(gòu)char[10]。

(2)數(shù)組名可以轉(zhuǎn)換為指向其指代實(shí)體的指針仪搔,而且是一個指針常量瘾婿,不能作自增、自減等操作烤咧,不能被修改偏陪;

char str[10];

str++; //編譯出錯,提示str不是左值

(3)數(shù)組名作為函數(shù)形參時髓削,淪為普通指針竹挡。

Windows NT 32位平臺下,指針的長度(占用內(nèi)存的大辛⑻拧)為4字節(jié),故sizeof( str ) 梯码、sizeof ( p ) 都為4宝泵。

試題3:寫一個“標(biāo)準(zhǔn)”宏MIN,這個宏輸入兩個參數(shù)并返回較小的一個轩娶。另外儿奶,當(dāng)你寫下面的代碼時會發(fā)生什么事?

least = MIN(*p++, b);

解答:

#define MIN(A,B) ((A) <= (B) ? (A) : (B))

MIN(*p++, b)會產(chǎn)生宏的副作用

剖析:

這個面試題主要考查面試者對宏定義的使用鳄抒,宏定義可以實(shí)現(xiàn)類似于函數(shù)的功能闯捎,但是它終歸不是函數(shù)椰弊,而宏定義中括弧中的“參數(shù)”也不是真的參數(shù),在宏展開的時候?qū)Α皡?shù)”進(jìn)行的是一對一的替換瓤鼻。

程序員對宏定義的使用要非常小心秉版,特別要注意兩個問題:

(1)謹(jǐn)慎地將宏定義中的“參數(shù)”和整個宏用用括弧括起來。所以茬祷,嚴(yán)格地講清焕,下述解答:

#define MIN(A,B) (A) <= (B) ? (A) : (B)

#define MIN(A,B) (A <= B ? A : B )

都應(yīng)判0分;

(2)防止宏的副作用祭犯。

宏定義#define MIN(A,B) ((A) <= (B) ? (A) : (B))對MIN(*p++, b)的作用結(jié)果是:

((*p++) <= (b) ? (*p++) : (*p++))

這個表達(dá)式會產(chǎn)生副作用秸妥,指針p會作三次++自增操作。

除此之外沃粗,另一個應(yīng)該判0分的解答是:

#define MIN(A,B) ((A) <= (B) ? (A) : (B));

這個解答在宏定義的后面加“;”粥惧,顯示編寫者對宏的概念模糊不清,只能被無情地判0分并被面試官淘汰最盅。

試題4:為什么標(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ù)引用。

作為一種面向?qū)ο蟮恼Z言檩禾,C++支持函數(shù)重載挂签,而過程式語言C則不支持。函數(shù)被C++編譯后在symbol庫中的名字與C語言的不同盼产。例如饵婆,假設(shè)某個函數(shù)的原型為:

void foo(int x, int y);

該函數(shù)被C編譯器編譯后在symbol庫中的名字為_foo,而C++編譯器則會產(chǎn)生像_foo_int_int之類的名字戏售。_foo_int_int這樣的名字包含了函數(shù)名和函數(shù)參數(shù)數(shù)量及類型信息侨核,C++就是考這種機(jī)制來實(shí)現(xiàn)函數(shù)重載的。

為了實(shí)現(xiàn)C和C++的混合編程灌灾,C++提供了C連接交換指定符號extern "C"來解決名字匹配問題搓译,函數(shù)聲明前加上extern "C"后,則編譯器就會按照C語言的方式將該函數(shù)編譯為_foo锋喜,這樣C語言中就可以調(diào)用C++的函數(shù)了些己。[img=12,12]file:///D:/魚魚軟件/魚魚多媒體日記本/temp/{C74A38C4-432E-4799-B54D-73E2CD3C5206}_arc_d[1].gif[/img]

試題5:編寫一個函數(shù),作用是把一個char組成的字符串循環(huán)右移n個嘿般。比如原來是“abcdefghi”如果n=2段标,移位后應(yīng)該是“hiabcdefgh”

函數(shù)頭是這樣的:

//pStr是指向以'\0'結(jié)尾的字符串的指針

//steps是要求移動的n

void LoopMove ( char * pStr, int steps )

{

//請?zhí)畛?..

}

解答:

正確解答1:

void LoopMove ( char *pStr, int steps )

{

int n = strlen( pStr ) - steps;

char tmp[MAX_LEN];

strcpy ( tmp, pStr + n );

strcpy ( tmp + steps, pStr);

*( tmp + strlen ( pStr ) ) = '\0';

strcpy( pStr, tmp );

}

正確解答2:

void LoopMove ( char *pStr, int steps )

{

int n = strlen( pStr ) - steps;

char tmp[MAX_LEN];

memcpy( tmp, pStr + n, steps );

memcpy(pStr + steps, pStr, n );

memcpy(pStr, tmp, steps );

}

剖析:

這個試題主要考查面試者對標(biāo)準(zhǔn)庫函數(shù)的熟練程度,在需要的時候引用庫函數(shù)可以很大程度上簡化程序編寫的工作量炉奴。

最頻繁被使用的庫函數(shù)包括:

(1) strcpy

(2) memcpy

(3) memset

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末逼庞,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子瞻赶,更是在濱河造成了極大的恐慌赛糟,老刑警劉巖派任,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異璧南,居然都是意外死亡掌逛,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進(jìn)店門穆咐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颤诀,“玉大人,你說我怎么就攤上這事对湃⊙陆校” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵拍柒,是天一觀的道長心傀。 經(jīng)常有香客問我,道長拆讯,這世上最難降的妖魔是什么脂男? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮种呐,結(jié)果婚禮上宰翅,老公的妹妹穿的比我還像新娘。我一直安慰自己爽室,他們只是感情好汁讼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著阔墩,像睡著了一般嘿架。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上啸箫,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天耸彪,我揣著相機(jī)與錄音,去河邊找鬼忘苛。 笑死蝉娜,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的柑土。 我是一名探鬼主播蜀肘,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼稽屏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起西乖,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤狐榔,失蹤者是張志新(化名)和其女友劉穎坛增,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體薄腻,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡收捣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了庵楷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片罢艾。...
    茶點(diǎn)故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖尽纽,靈堂內(nèi)的尸體忽然破棺而出咐蚯,到底是詐尸還是另有隱情,我是刑警寧澤弄贿,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布春锋,位于F島的核電站,受9級特大地震影響差凹,放射性物質(zhì)發(fā)生泄漏期奔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一危尿、第九天 我趴在偏房一處隱蔽的房頂上張望呐萌。 院中可真熱鬧,春花似錦谊娇、人聲如沸肺孤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渠旁。三九已至,卻和暖如春船逮,著一層夾襖步出監(jiān)牢的瞬間顾腊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工挖胃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留杂靶,地道東北人。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓酱鸭,卻偏偏與公主長得像吗垮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子凹髓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 多線程烁登、特別是NSOperation 和 GCD 的內(nèi)部原理。運(yùn)行時機(jī)制的原理和運(yùn)用場景蔚舀。SDWebImage的原...
    LZM輪回閱讀 2,007評論 0 12
  • iOS面試小貼士 ———————————————回答好下面的足夠了------------------------...
    不言不愛閱讀 1,975評論 0 7
  • 史上最全的iOS面試題及答案 iOS面試小貼士———————————————回答好下面的足夠了----------...
    Style_偉閱讀 2,352評論 0 35
  • 史上最全的iOS面試題及答案 迷途的羔羊--專為路癡量身打造的品牌饵沧。史上最精準(zhǔn)的定位锨络。想迷路都難!閃電更新中......
    南虞閱讀 1,504評論 0 8
  • ———————————————回答好下面的足夠了---------------------------------...
    恒愛DE問候閱讀 1,716評論 0 4