這裡講述的是IOS面試題及答案的相關內容,詳細內容請看上面
1. Object-c的類可以多重承繼麼?可以完成多個接口麼?Category是什麼?重寫一個類的方式用承繼好還是分類好?為什麼? 答: Object-c的類不可以多重承繼;可以完成多個接口,經過完成多個接口可以完成C++的多重承繼;Category是類別,普通狀況用分類好,用Category去重寫類的辦法,僅對本Category無效,不會影響到其他類與原有類的關系。 2. #import 跟#include 又什麼區別,@class呢, #import<> 跟 #import””又什麼區別? 答:#import是Objective-C導入頭文件的關鍵字,#include是C/C++導入頭文件的關鍵字,運用#import頭文件會自動只導入一次,不會反復導入,相當於#include和#pragma once;@class通知編譯器某個類的聲明,當執行時,才去檢查類的完成文件,可以處理頭文件的互相包括;#import<>用來包括零碎的頭文件,#import””用來包括用戶頭文件。 3. 屬性readwrite,readonly,assign,retain,copy,nonatomic 各是什麼作用,在那種狀況下用? (1) readwrite 是可讀可寫特性;需求生成getter辦法和setter辦法時 (2) readonly 是只讀特性 只會生成getter辦法 不會生成setter辦法 ;不希望屬性在類外改動 (3) assign 是賦值特性,setter辦法將傳入參數賦值給實例變量;僅設置變量時; (4) retain 表示持有特性,setter辦法將傳入參數先保存,再賦值,傳入參數的retaincount會+1; (5) copy 表示賦值特性,setter辦法將傳入對象復制一份;需求完全一份新的變量時。 (6) nonatomic 非原子操作,決議編譯器生成的setter getter能否是原子操作,atomic表示多線程平安,普通運用nonatomic 4.寫一個setter辦法用於完成@property (nonatomic,retain)NSString *name,寫一個setter辦法用於完成@property(nonatomic,copy)NSString *name - (void) setName:(NSString*) str{ [str retain]; [name release]; name = str; } - (void)setName:(NSString *)str{ id t = [str copy]; [name release]; name = t; } 5.關於語句NSString*obj = [[NSData alloc] init]; obj在編譯時和運轉時辨別時什麼類型的對象? 編譯時是NSString的類型;運轉時是NSData類型的對象 6.罕見的object-c的數據類型有那些, 和C的根本數據類型有什麼區別?如:NSInteger和int object-c的數據類型有NSString,NSNumber,NSArray,NSMutableArray,NSData等等,這些都是class,創立後便是對象,而C言語的根本數據類型int,只是一定字節的內存空間,用於寄存數值;NSInteger是根本數據類型,並不是NSNumber的子類,當然也不是NSObject的子類。NSInteger是根本數據類型Int或許Long的別名(NSInteger的定義typedef long NSInteger),它的區別在於,NSInteger會依據零碎是32位還是64位來決議是自身是int還是Long。 7.id 聲明的對象有什麼特性? Id 聲明的對象具有運轉時的特性,即可以指向恣意類型的objcetive-c的對象; 8.Objective-C如何對內存管理的,說說你的看法和處理辦法? Objective-C的內存管理次要有三種方式ARC(自動內存計數)、手動內存計數、內存池。 (1) (Garbage Collection)自動內存計數:這種方式和java相似,在你的順序的執行進程中。一直有一個高人在面前精確地幫你拾掇渣滓,你不必思索它什麼時分開端任務,怎樣任務。你只需求明白,我請求了一段內存空間,當我不再運用從而這段內存成為渣滓的時分,我就徹底的把它遺忘掉,反正那個高人會幫我拾掇渣滓。遺憾的是,那個高人需求耗費一定的資源,在攜帶設備外面,資源是緊俏商品所以iPhone不支持這個功用。所以“Garbage Collection”不是本入門指南的范圍,對“Garbage Collection”外部機制感興味的同窗可以參考一些其他的材料,不過說老假話“Garbage Collection”不大合適適初學者研討。 處理: 經過alloc – initial方式創立的, 創立後援用計數+1, 爾後每retain一次援用計數+1, 那麼在順序中做相應次數的release就好了. (2) (Reference Counted)手動內存計數:就是說,從一段內存被請求之後,就存在一個變量用於保管這段內存被運用的次數,我們暫時把它稱為計數器,當計數器變為0的時分,那麼就是釋放這段內存的時分。比方說,當在順序A外面一段內存被成功請求完成之後,那麼這個計數器就從0變成1(我們把這個進程叫做alloc),然後順序B也需求運用這個內存,那麼計數器就從1變成了2(我們把這個進程叫做retain)。緊接著順序A不再需求這段內存了,那麼順序A就把這個計數器減1(我們把這個進程叫做release);順序B也不再需求這段內存的時分,那麼也把計數器減1(這個進程還是release)。當零碎(也就是Foundation)發現這個計數器變成了0,那麼就會調用內存回收順序把這段內存回收(我們把這個進程叫做dealloc)。特地提一句,假如沒有Foundation,那麼維護計數器,釋放內存等等任務需求你手工來完成。 處理:普通是由類的靜態辦法創立的, 函數名中不會呈現alloc或init字樣, 如[NSString string]和[NSArray arrayWithObject:], 創立後援用計數+0, 在函數出棧後釋放, 即相當於一個棧上的部分變量. 當然也可以經過retain延伸對象的生活期. (3) (NSAutoRealeasePool)內存池:可以經過創立和釋放內存池控制內存請求和回收的機遇. 處理:是由autorelease參加零碎內存池, 內存池是可以嵌套的, 每個內存池都需求有一個創立釋放對, 好像main函數中寫的一樣. 運用也很復雜, 比方[[[NSString alloc]initialWithFormat:@”Hey you!”] autorelease], 行將一個NSString對象參加到最內層的零碎內存池, 當我們釋放這個內存池時, 其中的對象都會被釋放. 9. 原子(atomic)跟非原子(non-atomic)屬性有什麼區別? (1) atomic提供多線程平安。是避免在寫未完成的時分被另外一個線程讀取,形成數據錯誤 (2) non-atomic:在自己管理內存的環境中,解析的訪問器保存並自動釋放前往的值,假如指定了 nonatomic ,那麼訪問器只是復雜地前往這個值。 10. 看上面的順序,第一個NSLog會輸入什麼?這時str的retainCount是多少?第二個和第三個呢? 為什麼? ======================================================= NSMutableArray* ary = [[NSMutableArray array] retain]; NSString *str = [NSString stringWithFormat:@"test"]; [strretain]; [aryaddObject:str]; NSLog(@”%@%d”,str,[str retainCount]); [strretain]; [strrelease]; [strrelease]; NSLog(@”%@%d”,str,[str retainCount]); [aryremoveAllObjects]; NSLog(@”%@%d”,str,[str retainCount]); ======================================================= str的retainCount創立+1,retain+1,參加數組自動+1 3 retain+1,release-1,release-1 2 數組刪除一切對象,一切數組內的對象自動-1 1 11. 內存管理的幾條准繩時什麼?依照默許規律.那些關鍵字生成的對象 需求手動釋放?在和property結合的時分怎樣無效的防止內存洩露? 誰請求,誰釋放 遵照Cocoa Touch的運用准繩; 內存管理次要要防止“過早釋放”和“內存走漏”,關於“過早釋放”需求留意@property設置特性時,一定要用對特性關鍵字,關於“內存走漏”,一定要請求了要擔任釋放,要細心。 關鍵字alloc 或new 生成的對象需求手動釋放; 設置正確的property屬性,關於retain需求在適宜的中央釋放, 12.如何對IOS設備停止功能測試? Profile-> Instruments ->Time Profiler 13. Object C中創立線程的辦法是什麼?假如在主線程中執行代碼,辦法是什麼?假如想延時執行代碼、辦法又是什麼? 線程創立有三種辦法:運用NSThread創立、運用GCD的dispatch、運用子類化的NSOperation,然後將其參加NSOperationQueue;在主線程執行代碼,辦法是performSelectorOnMainThread,假如想延時執行代碼可以用performSelectornThread:withObject:waitUntilDone: 14.描繪一下iOS SDK中如何完成MVC的開發形式 MVC是模型、試圖、控制開發形式,關於iOS SDK,一切的View都是視圖層的,它應該獨立於模型層,由視圖控制層來控制。一切的用戶數據都是模型層,它應該獨立於視圖。一切的ViewController都是控制層,由它擔任控制視圖,訪問模型數據。 15 淺復制和深復制的區別? 答案:淺層復制:只復制指向對象的指針,而不復制援用對象自身。 深層復制:復制援用對象自身。 意思就是說我有個A對象,復制一份後失掉A_copy對象後,關於淺復制來說,A和A_copy指向的是同一個內存資源,復制的只不過是是一個指針,對象自身資源 還是只要一份,那假如我們對A_copy執行了修正操作,那麼發現A援用的對象異樣被修正,這其實違犯了我們復制拷貝的一個思想。深復制就好了解了,內存中存在了 兩份獨立對象自身。 用網上一哥們淺顯的話將就是: 淺復制好比你和你的影子,你完蛋,你的影子也完蛋 深復制好比你和你的克隆人,你完蛋,你的克隆人還活著。 16. 類別的作用?承繼和類別在完成中有何區別? 答案:category 可以在不得悉,不改動原來代碼的狀況下往外面添加新的辦法,只能添加,不能刪除修正。 並且假如類別和原來類中的辦法發生稱號抵觸,則類別將掩蓋原來的辦法,由於類別具有更高的優先級。 類別次要有3個作用: (1) 將類的完成分散到多個不同文件或多個不同框架中。 (2) 創立對公有辦法的前向援用。 (3) 向對象添加非正式協議。 承繼可以添加,修正或許刪除辦法,並且可以添加屬性。 17. 類別和類擴展的區別。 答案:category和extensions的不同在於 後者可以添加屬性。另外後者添加的辦法是必需要完成的。 extensions可以以為是一個公有的Category。 18. oc中的協議和java中的接口概念有何不同? 答案:OC中的代理有2層含義,官方定義為 formal和informal protocol。前者和Java接口一樣。 informal protocol中的辦法屬於設計形式思索范圍,不是必需完成的,但是假如有完成,就會改動類的屬性。 其實關於正式協議,類別和非正式協議我很早前學習的時分大致看過,也寫在了學習教程裡 “非正式協議概念其實就是類別的另一種表達方式“這裡有一些你能夠希望完成的辦法,你可以運用他們更好的完成任務”。 這個意思是,這些是可選的。比方我門要一個更好的辦法,我們就會聲明一個這樣的類別去完成。然後你在前期可以直接運用這些更好的辦法。 這麼看,總覺得類別這玩意兒有點像協議的可選協議。” 如今來看,其實protocal曾經開端對兩者都一致和標准起來操作,由於材料中說“非正式協議運用interface修飾“, 如今我們看到協議中兩個修飾詞:“必需完成(@requied)”和“可選完成(@optional)”。 19. 什麼是KVO和KVC? 答案:kvc:鍵 – 值編碼是一種直接訪問對象的屬性運用字符串來標識屬性,而不是經過調用存取辦法,直接或經過實例變量訪問的機制。 很多狀況下可以簡化順序代碼。apple文檔其實給了一個很好的例子。 kvo:鍵值察看機制,他提供了察看某一屬性變化的辦法,極大的簡化了代碼。 詳細用看到嗯哼用到過的一個中央是關於按鈕點擊變化形態的的監控。 比方我自定義的一個button [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]; } } 關於零碎是依據keypath去取的到相應的值發作改動,實際下去說是和kvc機制的道理是一樣的。 關於kvc機制如何經過key尋覓到value: “當經過KVC調用對象時,比方:[self valueForKey”someKey”]時,順序會自動試圖經過幾種不同的方式解析這個調用。首先查找對象能否帶有 someKey 這個辦法,假如沒找到,會持續查找對象能否帶有someKey這個實例變量(iVar),假如還沒有找到,順序會持續試圖調用 -(id) valueForUndefinedKey:這個辦法。假如這個辦法還是沒有被完成的話,順序會拋出一個NSUndefinedKeyException異常錯誤。 (cocoachina.com注:Key-Value Coding查找辦法的時分,不只僅會查找someKey這個辦法,還會查找getsomeKey這個辦法,後面加一個get,或許_someKey以及_getsomeKey這幾種方式。同時,查找實例變量的時分也會不只僅查找someKey這個變量,也會查找_someKey這個變量能否存在。) 設計valueForUndefinedKey:辦法的次要目的是當你運用-(id)valueForKey辦法從對象中懇求值時,對象可以在錯誤發作前,有最後的時機呼應這個懇求。這樣做有很多益處,上面的兩個例子闡明了這樣做的益處。“ 來至cocoa,這個說法應該挺有道理。 由於我們知道button卻是存在一個highlighted實例變量.因而為何下面我們只是add一個相關的keypath就行了, 可以依照kvc查找的邏輯了解,就說的過來了。 20. 代理的作用? 答案:代理的目的是改動或傳遞控制鏈。允許一個類在某些特定時辰告訴到其他類,而不需求獲取到那些類的指針。可以增加框架復雜度。 另外一點,代理可以了解為java中的回調監聽機制的一品種似。 21. oc中可修正和不可以修正類型。 答案:可修正不可修正的集合類。這個我團體復雜了解就是可靜態添加修正和不可靜態添加修正一樣。 比方NSArray和NSMutableArray。前者在初始化後的內存控件就是固定不可變的,後者可以添加等,可以靜態請求新的內存空間。 22. 我們說的oc是靜態運轉時言語是什麼意思? 答案:多態。 次要是將數據類型確實定由編譯時,推延到了運轉時。 這個問題其實淺觸及到兩個概念,運轉時和多態。 復雜來說,運轉機遇制使我們直到運轉時才去決議一個對象的類別,以及調用該類別對象指定辦法。 多態:不同對象以自己的方式呼應相反的音訊的才能叫做多態。意思就是假定生物類(life)都用有一個相反的辦法-eat; 那人類屬於生物,豬也屬於生物,都承繼了life後,完成各自的eat,但是調用是我們只需調用各自的eat辦法。 也就是不同的對象以自己的方式呼應了相反的音訊(呼應了eat這個選擇器)。 因而也可以說,運轉機遇制是多態的根底?~~~ 23. 告訴和協議的不同之處? 答案:協議有控制鏈(has-a)的關系,告訴沒有。 首先我一開端也不太明白,什麼叫控制鏈(專業術語了~)。但是復雜剖析下告訴和代理的行為形式,我們大致可以有自己的了解 復雜來說,告訴的話,它可以一對多,一條音訊可以發送給多個音訊承受者。 代理按我們的了解,到不是直接說不能一對多,比方我們知道的明星經濟代理人,很多時分一個經濟人擔任好幾個明星的事務。 只是關於不同明星間,代理的事物對象都是不一樣的,逐個對應,不能夠闡明天要處置A明星要一個發布會,代理人收回處置發布會的音訊後,別稱B的 發布會了。但是告訴就不一樣,他只關懷收回告訴,而不關懷多少接納到感興味要處置。 因而控制鏈(has-a從英語單詞大致可以看出,單一擁有和可控制的對應關系。 24. 是推送音訊? 答案:太復雜,不作答~~~~~~~~~~ 這是cocoa上的答案。 其實到不是說太復雜,只是太泛泛的一個概念的東西。就好比說,什麼是人。 推送告訴更是一種技術。 復雜點就是客戶端獲取資源的一種手腕。 普通狀況下,都是客戶端自動的pull。 推送則是服務器端自動push。 測試push的完成可以檢查該博文。 25. 關於多態性 答案:多態,子類指針可以賦值給父類。 這個標題其實可以出到一切面向對象言語中, 因而關於多態,承繼和封裝根本最好都有個自我認識的了解,也並非一定要把書上材料上寫的能背出來。 最重要的是轉化成自我了解。 26. 關於單例的了解 答案:11,12標題其實出的有點泛泛的覺得了,能夠說是編程言語需求或是必備的根底。 根本能用熟習的言語寫出一個單例,以及可以運用到的場景或是你編程中碰到過運用的此種形式的框架類等。 進一步點,思索下如何在多線程訪問單例時的平安性。 27. 說說呼應鏈 答案: 事情呼應鏈。包括點擊事情,畫面刷新事情等。在視圖棧內從上至下,或許從下之上傳達。 可以說點事情的分發,傳遞以及處置。詳細可以去看下touch事情這塊。由於問的太籠統化了 嚴重疑心標題出到越前面就越籠統。 可以從責任鏈形式,來講經過事情呼應鏈處置,其擁有的擴展性 28. frame和bounds有什麼不同? 答案:frame指的是:該view在父view坐標零碎中的地位和大小。(參照點是父親的坐標零碎) bounds指的是:該view在自身坐標零碎中 的地位和大小。(參照點是自身坐標零碎) 29. 辦法和選擇器有何不同? 答案:selector是一個辦法的名字,method是一個組合體,包括了名字和完成. 概況可以看apple文檔。 30. OC的渣滓回收機制? 答案: OC2.0有Garbage collection,但是iOS平台不提供。 普通我們理解的objective-c關於內存管理都是手動操作的,但是也有自動釋放池。 但是差了大局部材料,貌似不要和arc機制搞混就好了。 31. NSOperation queue? 答案:寄存NSOperation的集合類。 操作和操作隊列,根本可以看成java中的線程和線程池的概念。用於處置ios多線程開發的問題。 網上局部材料提到一點是,雖然是queue,但是卻並不是帶有隊列的概念,放入的操作並非是依照嚴厲的先進現出。 這邊又有個疑點是,關於隊列來說,先進先出的概念是Afunc添加進隊列,Bfunc緊跟著也進入隊列,Afunc先執行這個是必定的, 但是Bfunc是等Afunc完全操作完當前,B才開端啟動並且執行,因而隊列的概念離亂上有點違犯了多線程處置這個概念。 但是轉念一想其實可以參考銀行的取票和叫號零碎。 因而關於A比B先排隊取票但是B率先執行完操作,我們亦然可以理性以為這還是一個隊列。 但是後來看到一票關於這操作隊列話題的文章,其中有一句提到 “由於兩個操作提交的時間距離很近,線程池中的線程,誰先啟動是不定的。” 霎時覺得這個queue名字有點忽悠人了,還不如pool~ 綜合一點,我們知道他可以比擬大的用途在於可以幫組多線程編程就好了。 32. 什麼是延遲加載? 答案:懶漢形式,只在用到的時分才去初始化。 也可以了解成延時加載。 我覺得最好也最復雜的一個列子就是tableView中圖片的加載顯示了。 一個延時載,防止內存過高,一個異步加載,防止線程梗塞。 33. 能否在一個視圖控制器中嵌入兩個tableview控制器? 答案:一個視圖控制只提供了一個View視圖,實際上一個tableViewController也不能放吧, 只能說可以嵌入一個tableview視圖。當然,標題自身也有歧義,假如不是我們定性思想以為的UIViewController, 而是微觀的表示視圖控制者,那我們倒是可以把其看成一個視圖控制者,它可以控制多個視圖控制器,比方TabbarController 那樣的覺得。 34. 一個tableView能否可以關聯兩個不同的數據源?你會怎樣處置? 答案:首先我們從代碼來看,數據源如何關聯上的,其實是在數據源關聯的代理辦法裡完成的。 因而我們並不關懷如何去關聯他,他怎樣關聯上,辦法只是讓我前往依據自己的需求去設置如相關的數據源。 因而,我覺得可以設置多個數據源啊,但是有個問題是,你這是想干嘛呢?想讓列表如何顯示,不同的數據源分區塊顯示? 35. 什麼時分運用NSMutableArray,什麼時分運用NSArray? 答案:當數組在順序運轉時,需求不時變化的,運用NSMutableArray,當數組在初始化後,便不再改動的,運用NSArray。需求指出的是,運用NSArray只標明的是該數組在運轉時不發作改動,即不能往NSAarry的數組裡新增和刪除元素,但不標明其數組內的元素的內容不能發作改動。NSArray是線程平安的,NSMutableArray不是線程平安的,多線程運用到NSMutableArray需求留意。 36. 給出委托辦法的實例,並且說出UITableVIew的Data Source辦法 答案:CocoaTouch框架中用到了少量委托,其中UITableViewDelegate就是委托機制的典型使用,是一個典型的運用委托來完成適配器形式,其中UITableViewDelegate協議是目的,tableview是適配器,完成UITableViewDelegate協議,並將本身設置為talbeview的delegate的對象,是被適配器,普通狀況下該對象是UITableViewController。 UITableVIew的Data Source辦法有- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section; - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; 37. 在使用中可以創立多少autorelease對象,能否無限制? 答案:無 38. 假如我們不創立內存池,能否有內存池提供應我們? 答案:界面線程維護著自己的內存池,用戶自己創立的數據線程,則需求創立該線程的內存池 39. 什麼時分需求在順序中創立內存池? 答案:用戶自己創立的數據線程,則需求創立該線程的內存池 40. 類NSObject的那些辦法常常被運用? 答案:NSObject是Objetive-C的基類,其由NSObject類及一系列協議構成。 其中類辦法alloc、class、 description 對象辦法init、dealloc、– performSelector:withObject:afterDelay:等常常被運用 41. 什麼是簡便結構辦法? 答案:簡便結構辦法普通由CocoaTouch框架提供,如NSNumber的 + numberWithBool: + numberWithChar: + numberWithDouble: + numberWithFloat: + numberWithInt: Foundation下大局部類均有簡便結構辦法,我們可以經過簡便結構辦法,取得零碎給我們創立好的對象,並且不需求手動釋放。 42. 如何運用Xcode設計通用使用? 答案:運用MVC形式設計使用,其中Model層完成脫離界面,即在Model層,其是可運轉在任何設備上,在controller層,依據iPhone與iPad(獨有UISplitViewController)的不同特點選擇不同的viewController對象。在View層,可依據理想要求,來設計,其中以xib文件設計時,其設置其為universal。 43. UIView的動畫效果有那些? 答案:有很多,如 UIViewAnimationOptionCurveEaseInOut UIViewAnimationOptionCurveEaseIn UIViewAnimationOptionCurveEaSEOut UIViewAnimationOptionTransitionFlipFromLeft UIViewAnimationOptionTransitionFlipFromRight UIViewAnimationOptionTransitionCurlUpUIViewAnimationOptionTransitionCurlDown 44. 在iPhone使用中如何保管數據? 答案:有以下幾種保管機制: 1.經過web服務,保管在服務器上 2.經過NSCoder固化機制,將對象保管在文件中 3.經過SQLite或CoreData保管在文件數據庫中 45. 什麼是coredata? 答案:coredata是蘋果提供一套數據保管框架,其基於SQLite 46. 什麼是NSManagedObject模型? 答案:NSManagedObject是NSObject的子類 ,也是coredata的重要組成局部,它是一個通用的類,完成了core data 模型層所需的根本功用,用戶可經過子類化NSManagedObject,樹立自己的數據模型。 47. 什麼是NSManagedobjectContext? 答案:NSManagedobjectContext對象擔任使用和數據庫之間的交互。 48. 什麼是謂詞? 答案:謂詞是經過NSPredicate,是經過給定的邏輯條件作為約束條件,完成對數據的挑選。 predicate = [NSPredicate predicateWithFormat:@"customerID == %d",n]; a = [customers filteredArrayUsingPredicate:predicate]; 49. 和coredata一同有哪幾種耐久化存儲機制? 答案:存入到文件、 存入到NSUserDefaults(零碎plist文件中)、存入到SQLite文件數據庫 50. 談談對Block 的了解?並寫出一個運用Block執行UIVew動畫? 答案:Block是可以獲取其他函數部分變量的匿名函數,其不但方便開發,並且可以大幅進步使用的執行效率(多中心CPU可直接處置Block指令) [UIView transitionWithView:self.view duration:0.2 options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{ [[blueViewController view] removeFromSuperview]; [[self view] insertSubview:yellowViewController.view atIndex:0]; } completion:NULL]; 51. 寫出下面代碼的Block的定義。 答案: typedef void(^animations) (void); typedef void(^completion) (BOOL finished); 52. 試著運用+ beginAnimations:context:以及上述Block的定義,寫出一個可以完成 + (void)transitionWithView:(UIView *)view duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion NS_AVAILABLE_IOS(4_0);操作的函數執行局部 答案:無 網絡局部 53. 做過的項目能否觸及網絡訪問功用,運用什麼對象完成網絡功用? 答案:ASIHTTPRequest與NSURLConnection 54. 復雜引見下NSURLConnection類及+ sendSynchronousRequest:returningResponse:error:與– initWithRequest:delegate:兩個辦法的區別? 答案: NSURLConnection次要用於網絡訪問,其中+ sendSynchronousRequest:returningResponse:error:是同步訪問數據,即以後線程會阻塞,並等候request的前往的response,而– initWithRequest:delegate:運用的是異步加載,當其完成網絡訪問後,會經過delegate回到主線程,並其委托的對象。 55. 多線程是什麼 多線程是個復雜的概念,按字面意思是同步完成多項義務,進步了資源的運用效率,從硬件、操作零碎、使用軟件不同的角度去看,多線程被賦予不同的外延,關於硬件,如今市面上少數的CPU都是多核的,多核的CPU運算多線程更為出色;從操作零碎角度,是多義務,如今用的主流操作零碎都是多義務的,可以一邊聽歌、一邊寫博客;關於使用來說,多線程可以讓使用有更快的回應,可以在網絡下載時,同時呼應用戶的觸摸操作。在iOS使用中,對多線程最初的了解,就是並發,它的含義是原來先做燒水,再摘菜,再炒菜的任務,會變成燒水的同時去摘菜,最後去炒菜。 56. iOS 中的多線程 iOS中的多線程,是Cocoa框架下的多線程,經過Cocoa的封裝,可以讓我們更為方便的運用線程,做過C++的同窗能夠會對線程有更多的了解,比方線程的創建,信號量、共享變量有看法,Cocoa框架下會方便很多,它對線程做了封裝,有些封裝,可以讓我們創立的對象,自身便擁有線程,也就是線程的對象化籠統,從而增加我們的工程,提供順序的強健性。 GCD是(Grand Central Dispatch)的縮寫 ,從零碎級別提供的一個易用地多線程類庫,具有運轉時的特點,能充沛應用多中心硬件。GCD的API接口為C言語的函數,函數參數中少數有Block,關於Block的運用參看這裡,為我們提供弱小的“接口”,關於GCD的運用參見本文 NSOperation與Queue NSOperation是一個籠統類,它封裝了線程的細節完成,我們可以經過子類化該對象,加上NSQueue來同面向對象的思想,管理多線程順序。詳細可參看這裡:一個基於NSOperation的多線程網絡訪問的項目。 NSThread NSThread是一個控制線程執行的對象,它不如NSOperation籠統,經過它我們可以方便的失掉一個線程,並控制它。但NSThread的線程之間的並發控制,是需求我們自己來控制的,可以經過NSCondition完成。 參看 iOS多線程編程之NSThread的運用 其他多線程 在Cocoa的框架下,告訴、Timer和異步函數等都有運用多線程,(待補充). 57. 在項目什麼時分選擇運用GCD,什麼時分選擇NSOperation? 項目中運用NSOperation的優點是NSOperation是對線程的高度籠統,在項目中運用它,會使項目的順序構造更好,子類化NSOperation的設計思緒,是具有面向對象的優點(復用、封裝),使得完成是多線程支持,而接口復雜,建議在復雜項目中運用。 項目中運用GCD的優點是GCD自身十分復雜、易用,關於不復雜的多線程操作,會節省代碼量,而Block參數的運用,會是代碼更為易讀,建議在復雜項目中運用。 58. 什麼是block 關於閉包(block),有很多定義,其中閉包就是可以讀取其它函數外部變量的函數,這個定義即接近實質又較好了解。關於剛接觸Block的同窗,會覺得有些繞,由於我們習氣寫這樣的順序main(){ funA();} funA(){funB();} funB(){…..}; 就是函數main調用函數A,函數A調用函數B… 函數們順次順序執行,但理想中不全是這樣的,例如項目經理M,手下有3個順序員A、B、C,當他給順序員A布置完成功用F1時,他並不等著A完成之後,再去布置B去完成F2,而是布置給A功用F1,B功用F2,C功用F3,然後能夠去寫技術文檔,而當A遇到問題時,他會來找項目經理M,當B做完時,會告訴M,這就是一個異步執行的例子。在這種情形下,Block便可大顯神通,由於在項目經理M,給A布置任務時,同時會通知A若果遇到困難,如何能找到他報告問題(例如打他手機號),這就是項目經理M給A的一個回調接口,要回掉的操作,比方接到電話,百度查詢後,前往網頁內容給A,這就是一個Block,在M交待任務時,曾經定義好,並且獲得了F1的義務號(部分變量),卻是在當A遇到問題時,才調用執行,跨函數在項目經理M查詢百度,取得後果後回調該block。 59. block 完成原理 Objective-C是對C言語的擴展,block的完成是基於指針和函數指針。 從計算言語的開展,最早的goto,初級言語的指針,到面向對象言語的block,從機器的思想,一步步接近人的思想,以方便開發人員更為高效、直接的描繪呈現實的邏輯(需求)。 上面是兩篇很好的引見block完成的博文 iOS中block完成的探求 談Objective-C Block的完成 3 block的運用 運用實例 cocoaTouch框架下動畫效果的Block的調用 運用typed聲明block typedef void(^didFinishBlock) (NSObject *ob); 這就聲明了一個didFinishBlock類型的block, 然後便可用 @property (nonatomic,copy) didFinishBlock finishBlock; 聲明一個blokc對象,留意對象屬性設置為copy,接到block 參數時,便會自動復制一份。 __block是一種特殊類型, 運用該關鍵字聲明的部分變量,可以被block所改動,並且其在原函數中的值會被改動。 4 罕見系列面試題 面試時,面試官會先問一些,能否理解block,能否運用過block,這些問題相當於收場白,往往是上面一系列問題的開端,所以一定要照實依據自己的狀況答復。 1 運用block和運用delegate完成委托形式有什麼優點? 首先要理解什麼是委托形式,委托形式在iOS中少量使用,其在設計形式中是適配器形式中的對象適配器,Objective-C中運用id類型指向一切對象,使委托形式更為簡約。理解委托形式的細節: iOS設計形式—-委托形式 運用block完成委托形式,其優點是回調的block代碼塊定義在委托對象函數外部,使代碼更為緊湊; 適配對象不再需求完成詳細某個protocol,代碼更為簡約。 2 多線程與block GCD與Block 運用 dispatch_async 系列辦法,可以以指定的方式執行block GCD編程實例 dispatch_async的完好定義 void dispatch_async( dispatch_queue_t queue, dispatch_block_t block); 功用:在指定的隊列裡提交一個異步執行的block,不阻塞以後線程 經過queue來控制block執行的線程。主線程執行前文定義的 finishBlock對象 dispatch_async(dispatch_get_main_queue(),^(void){finishBlock();});
謝謝您的訪問.
【iOS面試題及答案】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!