iOS筆試題集錦

轉(zhuǎn)載原文鏈接

面試能力要求:精通iphone的UI開發(fā),能熟練操作復(fù)雜表視圖,熟練使用圖層技術(shù), 可以自定義UI控件,使用類別擴(kuò)展系統(tǒng)控件功能; 擅長(zhǎng)通訊技術(shù),熟悉各種通信協(xié)議,精通xml, json, 二進(jìn)制或其他形式的自定義解析,能架設(shè)服務(wù)器實(shí)現(xiàn)客戶端與服務(wù)器的通訊以提交開發(fā)效率;
熟練掌握各種數(shù)據(jù)存儲(chǔ)技術(shù),如core data, sqlite, 對(duì)象序列化,文件讀寫操作,熟悉數(shù)據(jù)庫(kù)的設(shè)計(jì)。 精通 object-c,java, c 等編程語言, 熟悉c++,對(duì)于 面向?qū)ο缶幊趟枷胗猩钊肜斫猓煜こR娫O(shè)計(jì)模式的應(yīng)用,
對(duì)于大型項(xiàng)目有一定的架構(gòu)能力。

  1. ViewController的didReceiveMemoryWarning怎么被調(diào)用:
    [supper didReceiveMemoryWarning];
    2.什么時(shí)候用delegate,什么時(shí)候用Notification?
    delegate針對(duì)one-to-one關(guān)系,用于sender接受到reciever的某個(gè)功能反饋值。
    notification針對(duì)one-to-one/many/none,reciver,用于通知多個(gè)object某個(gè)事件。

3.用預(yù)處理指令#define聲明一個(gè)常數(shù),用以表明1年中有多少秒(忽略閏年問題)#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 我在這想看到幾件事情: #define 語法的基本知識(shí)(例如:不能以分號(hào)結(jié)束,括號(hào)的使用,等等) 懂得預(yù)處理器將為你計(jì)算常數(shù)表達(dá)式的值,因此,直接寫出你是如何計(jì)算一年中有多少秒而不是計(jì)算出實(shí)際的值,是更清晰而沒有代價(jià)的。 意識(shí)到這個(gè)表達(dá)式將使一個(gè)16位機(jī)的整型數(shù)溢出-因此要用到長(zhǎng)整型符號(hào)L,告訴編譯器這個(gè)常數(shù)是的長(zhǎng)整型數(shù)。 如果你在你的表達(dá)式中用到UL(表示無符號(hào)長(zhǎng)整型),那么你有了一個(gè)好的起點(diǎn)。記住,第一印象很重要。

寫一個(gè)"標(biāo)準(zhǔn)"宏MIN ,這個(gè)宏輸入兩個(gè)參數(shù)并返回較小的一個(gè)。 #define MIN(A,B) ((A) <= (B) ? (A) : (B)) 這個(gè)測(cè)試是為下面的目的而設(shè)的: 標(biāo)識(shí)#define在宏中應(yīng)用的基本知識(shí)。這是很重要的,因?yàn)橹钡角度?inline)操作符變?yōu)闃?biāo)準(zhǔn)C的一部分,宏是方便產(chǎn)生嵌入代碼的唯一方法,對(duì)于嵌入式系統(tǒng)來說,為了能達(dá)到要求的性能,嵌入代碼經(jīng)常是必須的方法。 三重條件操作符的知識(shí)。這個(gè)操作符存在C語言中的原因是它使得編譯器能產(chǎn)生比 if-then-else 更優(yōu)化的代碼,了解這個(gè)用法是很重要的。 懂得在宏中小心地把參數(shù)用括號(hào)括起來 我也用這個(gè)問題開始討論宏的副作用,例如:當(dāng)你寫下面的代碼時(shí)會(huì)發(fā)生什么事? least = MIN(p++, b); 結(jié)果是:((p++) <= (b) ? (p++) : (p++))這個(gè)表達(dá)式會(huì)產(chǎn)生副作用,指針p會(huì)作三次++自增操作。

4.寫一個(gè)委托的 interface@protocol MyDelegate; @interface MyClass: NSObject{ id <MyDelegate> delegate;}
// 委托方法@protocol MyDelegate- (void)didJobs:(NSArray *)args;@end

  1. 寫一個(gè)NSString類的實(shí)現(xiàn)+ (id)initWithCString:(const char )nullTerminatedCString encoding:(NSStringEncoding)encoding;+ (id) stringWithCString: (const char)nullTerminatedCString encoding: (NSStringEncoding)encoding{ NSString *obj; obj = [self allocWithZone: NSDefaultMallocZone()]; obj = [obj initWithCString: nullTerminatedCString encoding: encoding]; return AUTORELEASE(obj);}
    6.obj-c有多重繼承么?不是的話有什么替代方法?cocoa 中所有的類都是NSObject 的子類多繼承在這里是用protocol 委托代理 來實(shí)現(xiàn)的 你不用去考慮繁瑣的多繼承 ,虛基類的概念.ood的多態(tài)特性 在 obj-c 中通過委托來實(shí)現(xiàn).

7.obj-c有私有方法么?私有變量呢 objective-c - 類里面的方法只有兩種, 靜態(tài)方法和實(shí)例方法. 這似乎就不是完整的面向?qū)ο罅?按照OO的原則就是一個(gè)對(duì)象只暴露有用的東西. 如果沒有了私有方法的話, 對(duì)于一些小范圍的代碼重用就不那么順手了. 在類里面聲名一個(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)都是公有的。
8.關(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 類型,以使得其返回值不為“左值”。關(guān)鍵字volatile有什么含意?并給出三個(gè)不同的例子。一個(gè)定義為 volatile的變量是說這變量可能會(huì)被意想不到地改變,這樣,編譯器就不會(huì)去假設(shè)這個(gè)變量的值了。
精確地說就是,優(yōu)化器在用到這個(gè)變量時(shí)必須每次都小心地重新讀取這個(gè)變量的值,而不是使用保存在寄存器里的備份。
下面是volatile變量的幾個(gè)例子: 并行設(shè)備的硬件寄存器(如:狀態(tài)寄存器) 一個(gè)中斷服務(wù)子程序中會(huì)訪問到的非自動(dòng)變量(Non-automatic variables) 多線程應(yīng)用中被幾個(gè)任務(wù)共享的變量 一個(gè)參數(shù)既可以是const還可以是volatile嗎?解釋為什么。 一個(gè)指針可以是volatile 嗎?解釋為什么。 下面是答案: 是的。一個(gè)例子是只讀的狀態(tài)寄存器。它是volatile因?yàn)樗赡鼙灰庀氩坏降馗淖儭K莄onst因?yàn)槌绦虿粦?yīng)該試圖去修改它。 是的。盡管這并不很常見。一個(gè)例子是當(dāng)一個(gè)中服務(wù)子程序修該一個(gè)指向一個(gè)buffer的指針時(shí)。

  1. 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 類型。

10.為什么標(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ù)引用。

10.#import跟#include的區(qū)別,@class呢? @class一般用于頭文件中需要聲明該類的某個(gè)實(shí)例變量的時(shí)候用到,在m文件中還是需要使用#import。 而#import比起#include的好處就是不會(huì)引起交叉編譯。

11.MVC模式的理解MVC設(shè)計(jì)模式考慮三種對(duì)象:模型對(duì)象、視圖對(duì)象、和控制器對(duì)象。
模型對(duì)象代表特別的知識(shí)和專業(yè)技能,它們負(fù)責(zé)保有應(yīng)用程序的數(shù)據(jù)和定義操作數(shù)據(jù)的邏輯。
視圖對(duì)象知道如何顯示應(yīng)用程序的模型數(shù)據(jù),而且可能允許用戶對(duì)其進(jìn)行編輯。
控制器對(duì)象是應(yīng)用程序的視圖對(duì)象和模型對(duì)象之間的協(xié)調(diào)者。
12.線程與進(jìn)程的區(qū)別和聯(lián)系?進(jìn)程和線程都是由操作系統(tǒng)所體會(huì)的程序運(yùn)行的基本單元,系統(tǒng)利用該基本單元實(shí)現(xiàn)系統(tǒng)對(duì)應(yīng)用的并發(fā)性。進(jìn)程和線程的主要差別在于它們是不同的操作系統(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)程。 13.列舉幾種進(jìn)程的同步機(jī)制,并比較其優(yōu)缺點(diǎn)。答案: 原子操作 信號(hào)量機(jī)制 自旋鎖 管程,會(huì)合,分布式系統(tǒng)
1.進(jìn)程之間通信的途徑答案:共享存儲(chǔ)系統(tǒng)消息傳遞系統(tǒng)管道:以文件系統(tǒng)為基礎(chǔ)
2.進(jìn)程死鎖的原因答案:資源競(jìng)爭(zhēng)及進(jìn)程推進(jìn)順序非法
3.死鎖的4個(gè)必要條件答案:互斥、請(qǐng)求保持、不可剝奪、環(huán)路
4.死鎖的處理答案:鴕鳥策略、預(yù)防策略、避免策略、檢測(cè)與解除死鎖

14.堆和棧的區(qū)別管理方式:對(duì)于棧來講,是由編譯器自動(dòng)管理,無需我們手工控制;對(duì)于堆來說,釋放工作由程序員控制,容易產(chǎn)生memory leak。1.申請(qǐng)大小:棧:在Windows下,棧是向低地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是一塊連續(xù)的內(nèi)存的區(qū)域。這句話的意思是棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預(yù)先規(guī)定好的,在WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個(gè)編譯時(shí)就確定的常數(shù)),如果申請(qǐng)的空間超過棧的剩余空間時(shí),將提示 overflow。因此,能從棧獲得的空間較小。
堆:堆是向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是不連續(xù)的內(nèi)存區(qū)域。這是由于系統(tǒng)是用鏈表來存儲(chǔ)的空閑內(nèi)存地址的,自然是不連續(xù)的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限于計(jì)算機(jī)系統(tǒng)中有效的虛擬內(nèi)存。由此可見,堆獲得的空間比較靈活,也比較大。2.碎片問題:對(duì)于堆來講,頻繁的new/delete勢(shì)必會(huì)造成內(nèi)存空間的不連續(xù),從而造成大量的碎片,使程序效率降低。對(duì)于棧來講,則不會(huì)存在這個(gè)問題,因?yàn)闂J窍冗M(jìn)后出的隊(duì)列,他們是如此的一一對(duì)應(yīng),以至于永遠(yuǎn)都不可能有一個(gè)內(nèi)存塊從棧中間彈出3.分配方式:堆都是動(dòng)態(tài)分配的,沒有靜態(tài)分配的堆。棧有2種分配方式:靜態(tài)分配和動(dòng)態(tài)分配。靜態(tài)分配是編譯器完成的,比如局部變量的分配。動(dòng)態(tài)分配由 alloca函數(shù)進(jìn)行分配,但是棧的動(dòng)態(tài)分配和堆是不同的,他的動(dòng)態(tài)分配是由編譯器進(jìn)行釋放,無需我們手工實(shí)現(xiàn)。4.分配效率:棧是機(jī)器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu),計(jì)算機(jī)會(huì)在底層對(duì)棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執(zhí)行,這就決定了棧的效率比較高。堆則是C/C++函數(shù)庫(kù)提供的,它的機(jī)制是很復(fù)雜的。 15.什么是鍵-值,鍵路徑是什么模型的性質(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ì)象的特定屬性。16.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.
17.cocoa touch框架iPhone OS 應(yīng)用程序的基礎(chǔ) Cocoa Touch 框架重用了許多 Mac 系統(tǒng)的成熟模式,但是它更多地專注于觸摸的接口和優(yōu)化。
UIKit 為您提供了在 iPhone OS 上實(shí)現(xiàn)圖形,事件驅(qū)動(dòng)程序的基本工具,其建立在和 Mac OS X 中一樣的 Foundation 框架上,
包括文件處理,網(wǎng)絡(luò),字符串操作等。 Cocoa Touch 具有和 iPhone 用戶接口一致的特殊設(shè)計(jì)。有了 UIKit,您可以使用 iPhone OS 上的獨(dú)特的圖形接口控件,按鈕,
以及全屏視圖的功能,您還可以使用加速儀和多點(diǎn)觸摸手勢(shì)來控制您的應(yīng)用。各色俱全的框架 除了 UIKit 外,Cocoa Touch 包含了創(chuàng)建世界一流 iPhone 應(yīng)用程序需要的所有框架,從三維圖形,到專業(yè)音效,
甚至提供設(shè)備訪問 API 以控制攝像頭,或通過 GPS 獲知當(dāng)前位置。
Cocoa Touch 既包含只需要幾行代碼就可以完成全部任務(wù)的強(qiáng)大的 Objective-C 框架,也在需要時(shí)提供基礎(chǔ)的 C 語言 API 來直接訪問系統(tǒng)。這些框架包括: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 中一小部分可用的框架:音頻和視頻:Core Audio ,OpenAL ,Media Library ,AV Foundation 數(shù)據(jù)管理 :Core Data ,SQLite 圖形和動(dòng)畫 :Core Animation ,OpenGL ES ,Quartz 2D 網(wǎng)絡(luò):Bonjour ,WebKit ,BSD Sockets 用戶應(yīng)用:Address Book ,Core Location ,Map Kit ,Store Kit

18.自動(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ù)減一.
19.objc優(yōu)點(diǎn): 1) Cateogies 2) Posing 3) 動(dòng)態(tài)識(shí)別 4) 指標(biāo)計(jì)算 5)彈性訊息傳遞 6) 不是一個(gè)過度復(fù)雜的 C 衍生語言 7) Objective-C 與 C++ 可混合編程 objc缺點(diǎn): 1) 不支援命名空間 2) 不支持運(yùn)算符重載 3) 不支持多重繼承 4) 使用動(dòng)態(tài)運(yùn)行時(shí)類型,所有的方法都是函數(shù)調(diào)用,所以很多編譯時(shí)優(yōu)化方法都用不到。(如內(nèi)聯(lián)函數(shù)等),性能低劣。

20.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ū)的大小,造成溢出。21. 用變量a給出下面的定義 a) 一個(gè)整型數(shù)(An integer) b)一個(gè)指向整型數(shù)的指針( A pointer to an integer) c)一個(gè)指向指針的的指針,它指向的指針是指向一個(gè)整型數(shù)( A pointer to a pointer to an intege)r d)一個(gè)有10個(gè)整型數(shù)的數(shù)組( An array of 10 integers) e) 一個(gè)有10個(gè)指針的數(shù)組,該指針是指向一個(gè)整型數(shù)的。(An array of 10 pointers to integers) f) 一個(gè)指向有10個(gè)整型數(shù)數(shù)組的指針( A pointer to an array of 10 integers) g) 一個(gè)指向函數(shù)的指針,該函數(shù)有一個(gè)整型參數(shù)并返回一個(gè)整型數(shù)(A pointer to a function that takes an integer as an argument and returns an integer) h) 一個(gè)有10個(gè)指針的數(shù)組,該指針指向一個(gè)函數(shù),該函數(shù)有一個(gè)整型參數(shù)并返回一個(gè)整型數(shù)( An array of ten pointers to functions that take an integer argument and return an integer ) 答案是: 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 functions that take an integer argument and return an integer

22.readwrite,readonly,assign,retain,copy,nonatomic 屬性的作用@property是一個(gè)屬性訪問聲明,擴(kuò)號(hào)內(nèi)支持以下幾個(gè)屬性:1,getter=getterName,setter=setterName,設(shè)置setter與 getter的方法名2,readwrite,readonly,設(shè)置可供訪問級(jí)別2,assign,setter方法直接賦值,不進(jìn)行任何retain操作,為了解決原類型與環(huán)循引用問題3,retain,setter方法對(duì)參數(shù)進(jìn)行release舊值再retain新值,所有實(shí)現(xiàn)都是這個(gè)順序(CC上有相關(guān)資料)4,copy,setter方法進(jìn)行Copy操作,與retain處理流程一樣,先舊值release,再 Copy出新的對(duì)象,retainCount為1。
這是為了減少對(duì)上下文的依賴而引入的機(jī)制。5,nonatomic,非原子性訪問,不加同步,多線程并發(fā)訪問會(huì)提高性能。注意,如果不加此屬性,則默認(rèn)是兩個(gè)訪問方法
都為原子型事務(wù)訪問。鎖被加到所屬對(duì)象實(shí)例級(jí)(我是這么理解的...)。

23.http和scoket通信的區(qū)別。
http是客戶端用http協(xié)議進(jìn)行請(qǐng)求,發(fā)送請(qǐng)求時(shí)候需要封裝http請(qǐng)求頭,并綁定請(qǐng)求的數(shù)據(jù),服務(wù)器一般有web服務(wù)器配合(當(dāng)然也非絕對(duì))。 http請(qǐng)求方式為客戶端主動(dòng)發(fā)起請(qǐng)求,服務(wù)器才能給響應(yīng),一次請(qǐng)求完畢后則斷開連接,以節(jié)省資源。服務(wù)器不能主動(dòng)給客戶端響應(yīng)(除非采取http長(zhǎng)連接技術(shù))。iphone主要使用類是NSUrlConnection。
scoket是客戶端跟服務(wù)器直接使用socket“套接字”進(jìn)行連接,并沒有規(guī)定連接后斷開,所以客戶端和服務(wù)器可以保持連接通道,雙方都可以主動(dòng)發(fā)送數(shù)據(jù)。一般在游戲開發(fā)或股票開發(fā)這種要求即時(shí)性很強(qiáng)并且保持發(fā)送數(shù)據(jù)量比較大的場(chǎng)合使用。主要使用類是CFSocketRef。
24.mvc設(shè)計(jì)模式是什么? 你還熟悉什么設(shè)計(jì)模式?設(shè)計(jì)模式:并不是一種新技術(shù),而是一種編碼經(jīng)驗(yàn),使用比如java中的接口,iphone中的協(xié)議,繼承關(guān)系等基本手段,
用比較成熟的邏輯去處理某一種類型的事情,總結(jié)為所謂設(shè)計(jì)模式。面向?qū)ο缶幊讨校琷ava已經(jīng)歸納了23中設(shè)計(jì)模式。mvc設(shè)計(jì)模式 ,模型,視圖,控制器,可以將整個(gè)應(yīng)用程序在思想上分成三大塊,對(duì)應(yīng)是的數(shù)據(jù)的存儲(chǔ)或處理,前臺(tái)的顯示,
業(yè)務(wù)邏輯的控制。 Iphone本身的設(shè)計(jì)思想就是遵循mvc設(shè)計(jì)模式。其不屬于23中設(shè)計(jì)模式范疇。代理模式:代理模式給某一個(gè)對(duì)象提供一個(gè)代理對(duì)象,并由代理對(duì)象控制對(duì)源對(duì)象的引用.比如一個(gè)工廠生產(chǎn)了產(chǎn)品,
并不想直接賣給用戶,而是搞了很多代理商,用戶可以直接找代理商買東西,代理商從工廠進(jìn)貨.常見的如QQ的自動(dòng)回復(fù)就屬于代理攔截,代理模式在iphone中得到廣泛應(yīng)用.單例模式:說白了就是一個(gè)類不通過alloc方式創(chuàng)建對(duì)象,而是用一個(gè)靜態(tài)方法返回這個(gè)類的對(duì)象。系統(tǒng)只需要擁有一個(gè)的全局對(duì)象,
這樣有利于我們協(xié)調(diào)系統(tǒng)整體的行為,比如想獲得[UIApplication sharedApplication];任何地方調(diào)用都可以得到 UIApplication的對(duì)象,
這個(gè)對(duì)象是全局唯一的。觀察者模式: 當(dāng)一個(gè)物體發(fā)生變化時(shí),會(huì)通知所有觀察這個(gè)物體的觀察者讓其做出反應(yīng)。實(shí)現(xiàn)起來無非就是把所有觀察者的對(duì)象給這個(gè)物體,
當(dāng)這個(gè)物體的發(fā)生改變,就會(huì)調(diào)用遍歷所有觀察者的對(duì)象調(diào)用觀察者的方法從而達(dá)到通知觀察者的目的。工廠模式:
public class Factory{  public static Sample creator(int which){   if (which==1) return new SampleA();  else if (which==2) return new SampleB(); } }25.你了解svn,cvs等版本控制工具么?版本控制 svn,cvs 是兩種版控制的器,需要配套相關(guān)的svn,cvs服務(wù)器。scm是xcode里配置版本控制的地方。版本控制的原理就是a和b同時(shí)開發(fā)一個(gè)項(xiàng)目,a寫完當(dāng)天的代碼之后把代碼提交給服務(wù)器,
b要做的時(shí)候先從服務(wù)器得到最新版本,就可以接著做。 如果a和b都要提交給服務(wù)器,并且同時(shí)修改了同一個(gè)方法,就會(huì)產(chǎn)生代碼沖突,
如果a先提交,那么b提交時(shí),服務(wù)器可以提示沖突的代碼,b可以清晰的看到,并做出相應(yīng)的修改或融合后再提交到服務(wù)器。

26.什么是push(了解一下)。
客戶端程序留下后門端口,客戶端總是監(jiān)聽針對(duì)這個(gè)后門的請(qǐng)求,于是 服務(wù)器可以主動(dòng)像這個(gè)端口推送消息。

27.靜態(tài)鏈接庫(kù)(了解一下)
(此為.a文件,相當(dāng)于java里的jar包,把一些類編譯到一個(gè)包中,在不同的工程中如果導(dǎo)入此文件就可以使用里面的類,
具體使用依然是#import “ xx.h”)。

28.fmmpeg框架(了解一下)
(音視頻編解碼框架,內(nèi)部使用UDP協(xié)議針對(duì)流媒體開發(fā),內(nèi)部開辟了六個(gè)端口來接受流媒體數(shù)據(jù),完成快速接受之目的).

29.fmdb框架(了解一下)
(數(shù)據(jù)庫(kù)框架,對(duì)sqllite的數(shù)據(jù)操作進(jìn)行了封裝,使用著可把精力都放在sql語句上面)。

30.320框架(了解一下)
(ui框架,導(dǎo)入320工程作為框架包如同添加一個(gè)普通框架一樣)。
cover(open) flower框架 (2d 仿射技術(shù)),內(nèi)部核心類是CATransform3D.

31.什么是沙箱模型?哪些操作是屬于私有api范疇?
某個(gè)iphone工程進(jìn)行文件操作有此工程對(duì)應(yīng)的指定的位置,不能逾越。iphone沙箱模型的有四個(gè)文件夾,分別是什么,永久數(shù)據(jù)存儲(chǔ)一般放在什么位置,得到模擬器的路徑的簡(jiǎn)單方式是什么.
documents,tmp,app,Library。
(NSHomeDirectory()),
手動(dòng)保存的文件在documents文件里
Nsuserdefaults保存的文件在tmp文件夾里

Documents 目錄:您應(yīng)該將所有de應(yīng)用程序數(shù)據(jù)文件寫入到這個(gè)目錄下。這個(gè)目錄用于存儲(chǔ)用戶數(shù)據(jù)或其它應(yīng)該定期備份信息。AppName.app 目錄:這是應(yīng)用程序程序包目錄,包含應(yīng)用程序本身。由于應(yīng)用程序必須經(jīng)過簽名,
所以您在運(yùn)行時(shí)不能對(duì)這個(gè)目錄中內(nèi)容進(jìn)行修改,否則可能會(huì)使應(yīng)用程序無法啟動(dòng)。Library 目錄:這個(gè)目錄下有兩個(gè)子目錄:Caches 和 PreferencesPreferences 目錄包含應(yīng)用程序偏好設(shè)置文件。您不應(yīng)該直接創(chuàng)建偏好設(shè)置文件,而是應(yīng)該使用NSUserDefaults類來取得和設(shè)置應(yīng)用程序偏好.Caches 目錄用于存放應(yīng)用程序?qū)S?strong>的支持文件,保存應(yīng)用程序再次啟動(dòng)過程中需要信息。
tmp 目錄:這個(gè)目錄用于存放臨時(shí)文件,保存應(yīng)用程序再次啟動(dòng)過程中不需要信息。獲取這些目錄路徑方法:1,獲取家目錄路徑函數(shù):NSString homeDir = NSHomeDirectory();2,獲取Documents目錄路徑方法:NSArray paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);NSString docDir = [paths objectAtIndex:0];3,獲取Caches目錄路徑方法:NSArray paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);NSString cachesDir = [paths objectAtIndex:0];4,獲取tmp目錄路徑方法:NSString tmpDir = NSTemporaryDirectory();5,獲取應(yīng)用程序程序包中資源文件路徑方法:例如獲取程序包中一個(gè)圖片資源(apple.png)路徑方法:NSString imagePath = [[NSBundle mainBundle] pathForResource:@”apple” ofType:@”png”];UIImage appleImage = [[UIImage alloc] initWithContentsOfFile:imagePath];代碼中mainBundle類方法用于返回一個(gè)代表應(yīng)用程序包對(duì)象。
文件IO寫入1,將數(shù)據(jù)寫到Documents目錄:- (BOOL)writeApplicationData:(NSData *)data toFile:(NSString *)fileName {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [paths objectAtIndex:0];
if (!docDir) {
NSLog(@”Documents directory not found!”); return NO;
}
NSString *filePath = [docDir stringByAppendingPathComponent:fileName]; return [data writeToFile:filePath atomically:YES];
}
2,從Documents目錄讀取數(shù)據(jù):- (NSData *)applicationDataFromFile:(NSString *)fileName { NSArray paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString docDir = [paths objectAtIndex:0];
NSString filePath = [docDir stringByAppendingPathComponent:fileName];
NSData data = [[[NSData alloc] initWithContentsOfFile:filePath] autorelease];
return data;
}NSSearchPathForDirectoriesInDomains這個(gè)主要就是返回一個(gè)絕對(duì)路徑用來存放我們需要儲(chǔ)存
文件。

  • (NSString )dataFilePath {
    NSArray paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString documentsDirectory = [paths objectAtIndex:0]; return [documentsDirectory stringByAppendingPathComponent:@"shoppingCar.plist"];}
    NSFileManager
    fm=[NSFileManager defaultManager];if(![fm fileExistsAtPath:[self dataFilePath]]){
    //下面是對(duì)該文件進(jìn)行制定路徑
    的**保存[fm createDirectoryAtPath:[self dataFilePath] withIntermediateDirectories:YES attributes:nil error:nil];
    //取得一個(gè)目錄下得所有文件名NSArray *files = [fm subpathsAtPath: [self dataFilePath] ];
    //讀取某個(gè)文件NSData *data = [fm contentsAtPath:[self dataFilePath]];
    //或者NSData *data = [NSData dataWithContentOfPath:[self dataFilePath]];}
    iphone常見私有api的應(yīng)用(比如直接發(fā)送短信,訪問沙箱之外的磁盤文件).32.你在開發(fā)項(xiàng)目中時(shí),用到了哪些數(shù)據(jù)存儲(chǔ)方式,iphone中常見的方式有哪些,各有什么區(qū)別?
    數(shù)據(jù)存儲(chǔ)五種形式的應(yīng)用范圍和性能區(qū)別
    (core data, sqllite,對(duì)象序列化,文件直接讀寫,NSUserDefault(保存數(shù)據(jù)到temp文件夾中))文件直接讀寫 >core data> 對(duì)象序列化> sqllite>NSUserDefault.
    33.線程的常見方法有哪些,你是如何處理多線程的,多線程同步問題你了解么?線程創(chuàng)建的幾種方式,線程的加鎖,休眠,喚醒,解鎖,退出,
    多線程要考慮同步問題,解決同步問題的方式就是對(duì)某一資源加鎖,當(dāng)一個(gè)線程操作本資源時(shí),其他線程不能操作 。 系統(tǒng)自帶線程池(NSOpertionQueue)的作用:
    凡是需要啟動(dòng)多個(gè)線程的地方都可以使用NSOpertionQueue,加入到NSOpertionQueue中的對(duì)象都需要繼承NSOpertion。 NSOpertionQueue會(huì)在系統(tǒng)內(nèi)部啟動(dòng)一個(gè)獨(dú)立線程去執(zhí)行這個(gè)被加入對(duì)象的main方法。
    常用的地方是用nsoprationqueue 下載圖片,文件。如果是自己創(chuàng)建一個(gè)線程池,無非就是啟動(dòng)多個(gè)線程的時(shí)候,
    把這些線程對(duì)象放到一個(gè)大數(shù)組中,如果需要啟動(dòng)線程的時(shí)候,先從數(shù)組中找空閑線程來使用。
    自己管理線程池最大的難題是不好處理當(dāng)啟動(dòng)多個(gè)線程后,用戶在多個(gè)界面的跳轉(zhuǎn)的時(shí)候,對(duì)線程方法的回調(diào)管理。
    而NSOpertionQueue可以很好的處理他。

34.init和initwithobject區(qū)別(語法)?
init創(chuàng)建的對(duì)象不帶自動(dòng)釋放

35.你連接服務(wù)器用的是什么方法,如果請(qǐng)求過程中,網(wǎng)絡(luò)出了問題這么辦?NSUrlConnection 連接后,有一系列委托方法來接受來自服務(wù)器的響應(yīng)和數(shù)據(jù),
其中接受相應(yīng)的方法回得到服務(wù)器要傳回的數(shù)據(jù)有多大,接受數(shù)據(jù)的方法會(huì)反復(fù)調(diào)用來不斷接受服務(wù)器數(shù)據(jù),
如果網(wǎng)絡(luò)出了問題了,會(huì)調(diào)用一個(gè)方法讓你來做相關(guān)處理。
36.你使用過json解析方式么,他們的底層是如何處理的你了解么?
json解析的用法,用框架的用法簡(jiǎn)單介紹:
底層原理遍歷字符串中的字符,最終根據(jù)格式規(guī)定的特殊字符,比如{}號(hào),[]號(hào), : 號(hào) 等進(jìn)行區(qū)分, {}號(hào)是一個(gè)字典的開始,[]號(hào)是一個(gè)數(shù)組的開始, : 號(hào)是字典的鍵和值的分水嶺,最終乃是將json數(shù)據(jù)轉(zhuǎn)化為字典,
字典中值可能是字典,數(shù)組,或字符串而已。

37.xml解析的原理是什么,你還用過其他解析方式么?NSXMLParser, 其他解析方式有自定義二進(jìn)制解析,就是按字節(jié)去解析,電話會(huì)談就是如此,
還可以是字符串之間用特殊符號(hào)連接的數(shù)據(jù),將此數(shù)據(jù)用特殊符號(hào)可以分割成所用數(shù)據(jù)。

38.協(xié)議是什么,有什么作用.?
協(xié)議很像java中的接口,某個(gè)類實(shí)現(xiàn)協(xié)議后,就必須實(shí)現(xiàn)協(xié)議中規(guī)定的@require的方法,比如一個(gè)類A, 一個(gè)類B都實(shí)現(xiàn)某“協(xié)議”后,
這個(gè)類A的對(duì)象和B的對(duì)象都可以賦值給這個(gè)協(xié)議的類型變量,比如 id<協(xié)議> 變量名 = A類或B類的對(duì)象,
于是這個(gè)變量就完成了能夠指向多個(gè)不同的類的對(duì)象并調(diào)用對(duì)象中的實(shí)現(xiàn)協(xié)議的方法。39.類別有什么作用?類別的使用 。 類別有三大作用,

  1. 可以使本來需要在.h中聲明的方法放到.m文件中聲明,達(dá)到了可以使方法不對(duì)外公開。
  2. 可以方便的擴(kuò)展類,甚至系統(tǒng)類都可以輕易擴(kuò)展,維護(hù)了代碼原本的結(jié)構(gòu)不受影響。
  3. 類別可以寫到不同的.h或.m文件中,可以分散代碼到跟類別的擴(kuò)展功能想關(guān)聯(lián)的地方,方便查看。40.分線程回調(diào)主線程方法是什么,有什么作用? [self performSelectorOnMainThread:@selector(buttonGo2) withObject:nil waitUntilDone:YES];[self performSelector:@selector(buttonGo2) onThread:[NSThread mainThread] withObject:nil waitUntilDone:YES];需要即時(shí)刷新ui控件的時(shí)候,經(jīng)常使用。41.iphone閱讀器,如果要讀取一個(gè)文本文件,請(qǐng)問你是如何處理編碼問題的?另外像pdf格式的文件,你如何讀取。?
    iphone手機(jī)閱讀器中對(duì)于PDF格式的閱讀,可以直接用UIWebView控件顯示,也可以從網(wǎng)上下到很多直接讀取pdf格式的代碼
    直接從pdf中得到數(shù)據(jù)。復(fù)雜表格動(dòng)畫- (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation; -(void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;
    42.你在開發(fā)大型項(xiàng)目的時(shí)候,如何進(jìn)行內(nèi)存泄露檢測(cè)的? 可以通過xcode的自帶工具run---start with performance tool里有instruments下有個(gè)leaks工具,
    啟動(dòng)此工具后,運(yùn)行項(xiàng)目,工具里可以顯示內(nèi)存泄露的情況,雙擊可找到源碼位置,可以幫助進(jìn)行內(nèi)存泄露的處理。

43.你做iphone開發(fā)時(shí)候,有哪些傳值方式,view和view之間是如何傳值的?
壓棧。

44.讓一個(gè)物體從界面中的一點(diǎn)運(yùn)動(dòng)到另外一點(diǎn),有哪些方法?四種方式:1. beginAnimation
2. 線程
3. NSTimer
4. 圖層動(dòng)畫(路徑)
45.你了解哪些加密方式? Base64, MD5, 循環(huán)右移位等.

46.地圖定位
CLLocationManager位置管理器 使用Core Location框架來確定iphone的位置(GPS,蜂窩基站三角網(wǎng),wps三種方式)
MKMapView提供了一套可植入的地圖接口,可以讓我們?cè)趹?yīng)用中展示地圖,并對(duì)其進(jìn)行相關(guān)的操作。一般來說,我們可以指定一個(gè)展示區(qū)域,放一些標(biāo)記在上面,還可以加蓋一些層在上面。
MKMapView依賴Google map里面相關(guān)服務(wù)(如Google Earth API等),所以地圖的左下角會(huì)有Google字樣。

47.打開url
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://8004664411"]];mailto:// sms://

  1. http網(wǎng)絡(luò)通信
    ASIHTTPRequest 是一個(gè)直接在CFNetwork上做的開源項(xiàng)目:提供直接提交(HTTP POST)文件的API,異步請(qǐng)求與隊(duì)列,自動(dòng)管理上傳與下載隊(duì)列管理機(jī),ASIFormDataRequest用于適合上傳文件,圖片數(shù)據(jù)。

  2. 圖片瀏覽
    UIImagePickerController可以從相冊(cè),相機(jī),膠卷里獲得圖片。

  3. 對(duì)像序列化
    NSCoding encodeWithCoder initWithCoder
    NSKeyedUnarchiver NSKeyedArchiver

  4. 各種picker
    UIDatePicker UIPickerView

  5. 電影播放
    MPMoviePlayerController
    音樂播放
    MPMusicPlayerController

53.線程 ?
a. 線程的創(chuàng)建和使用規(guī)則?
答:NSThread
三種方法
- (id)init; // designated initializer
- (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument;
+ (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument
- (void)start;
b. 主分線程
答:?jiǎn)?dòng)分線程,上面已提到!加到主線程方法performSelector!
//加到主線程addData()是主線程的方法!只有加到主線程后,才能調(diào)用主線程的方法
[target performSelector:@selector(addData:) onThread:[NSThread mainThread] withObject:item waitUntilDone:YES];
//[target addData:item];//沒有加到主線程后,調(diào)用主線程的方法!一定會(huì)崩!

  c.線程鎖
     答:NSCondition
             方法:
             [thread lock];//加鎖
             sleep(n);//線程休眠
             [thread singnal];//相當(dāng)于通知,線程啟動(dòng)
             [thread unlock];//解鎖
             [thread exit];//線程退出

54.各種 排序算法?
希爾排序、快速排序、冒泡排序、

55.通信底層原理
答:OSI七層模型
7 應(yīng)用層: ftp,smtp,http,telnet,tftp(通過各種協(xié)議,最終還是包裝成TCP數(shù)據(jù)包,發(fā)送到網(wǎng)絡(luò)中!)
6 表現(xiàn)層:
5 會(huì)話層:
4 傳輸層: tcp udp
3 網(wǎng)絡(luò)層: ip,ICMP,IGRP,EIGRP,OSPF,ARP
2 數(shù)據(jù)鏈路層: STP,VT
1 物理層:

  1. 為什么很多內(nèi)置類如UITableViewController的delegate屬性都是assign而不是retain的?
    答:
    會(huì)引起循環(huán)引用
    所有的引用計(jì)數(shù)系統(tǒng),都存在循環(huán)應(yīng)用的問題。例如下面的引用關(guān)系:
    * 對(duì)象a創(chuàng)建并引用到了對(duì)象b.
    * 對(duì)象b創(chuàng)建并引用到了對(duì)象c.
    * 對(duì)象c創(chuàng)建并引用到了對(duì)象b.

    這時(shí)候b和c的引用計(jì)數(shù)分別是2和1。
    當(dāng)a不再使用b,調(diào)用release釋放對(duì)b的所有權(quán),因?yàn)閏還引用了b,所以b的引用計(jì)數(shù)為1,b不會(huì)被釋放。
    b不釋放,c的引用計(jì)數(shù)就是1,c也不會(huì)被釋放。從此,b和c永遠(yuǎn)留在內(nèi)存中。
    這種情況,必須打斷循環(huán)引用,通過其他規(guī)則來維護(hù)引用關(guān)系。我們常見的delegate往往是assign方式的屬性而不是retain方式 的屬性,
    賦值不會(huì)增加引用計(jì)數(shù),就是為了防止delegation兩端產(chǎn)生不必要的循環(huán)引用。
    如果一個(gè)UITableViewController 對(duì)象a通過retain獲取了UITableView對(duì)象b的所有權(quán),這個(gè)UITableView對(duì)象b的delegate又是a,
    如果這個(gè)delegate是retain方式的,那基本上就沒有機(jī)會(huì)釋放這兩個(gè)對(duì)象了。自己在設(shè)計(jì)使用delegate模式時(shí),也要注意這點(diǎn)。

  2. 以下每行代碼執(zhí)行后,person對(duì)象的retain count分別是多少?
    Person *person = [[Person alloc] init]; count 1
    [person retain]; retain count 2
    [person release];retain count 1
    [person release];retain count = 0

58.在一個(gè)對(duì)象的方法里面:
self.name = “object”;

name =”object”
有什么不同嗎?
答:self.name = "object"會(huì)調(diào)用對(duì)象的setName()方法,會(huì)使object引用計(jì)數(shù)加1,name = "object"會(huì)直接把object賦值給當(dāng)前對(duì)象的name 屬性,引用計(jì)數(shù)不增加。
59.readwrite,readonly,assign,retain,copy,nonatomic屬性的作用?

@property是一個(gè)屬性訪問聲明,擴(kuò)號(hào)內(nèi)支持以下幾個(gè)屬性:
1,getter=getterName,setter=setterName,設(shè)置setter與getter的方法名
2,readwrite,readonly,設(shè)置可供訪問級(jí)別

3,assign,setter方法直接賦值,不進(jìn)行任何retain操作,為了解決原類型與環(huán)循引用問題
4,retain,setter方法對(duì)參數(shù)進(jìn)行release舊值再retain新值,所有實(shí)現(xiàn)都是這個(gè)順序(CC上有相關(guān)資料)

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

6,nonatomic,非原子性訪問,不加同步,多線程并發(fā)訪問會(huì)提高性能。注意,如果不加此屬性,則默認(rèn)是兩個(gè)訪問方法都為原子型事務(wù)訪問。鎖被加到所屬對(duì)象實(shí)例級(jí)(我是這么理解的…)。
7,@synthesize xxx; 來實(shí)現(xiàn)實(shí)際代碼
60.1.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ù)組指針,所以要加 5sizeof(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].B

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,217評(píng)論 30 472
  • iOS面試小貼士 ———————————————回答好下面的足夠了------------------------...
    不言不愛閱讀 2,014評(píng)論 0 7
  • 1.項(xiàng)目經(jīng)驗(yàn) 2.基礎(chǔ)問題 3.指南認(rèn)識(shí) 4.解決思路 ios開發(fā)三大塊: 1.Oc基礎(chǔ) 2.CocoaTouch...
    陽(yáng)光的大男孩兒閱讀 5,042評(píng)論 0 13
  • 多線程、特別是NSOperation 和 GCD 的內(nèi)部原理。運(yùn)行時(shí)機(jī)制的原理和運(yùn)用場(chǎng)景。SDWebImage的原...
    LZM輪回閱讀 2,043評(píng)論 0 12
  • __block和__weak修飾符的區(qū)別其實(shí)是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用,...
    LZM輪回閱讀 3,374評(píng)論 0 6