iOS面試題-第十三頁

41. 什么是簡便構(gòu)造方法?

答:簡便構(gòu)造方法一般由CocoaTouch框架提供,如NSNumber的 + numberWithBool: + numberWithChar: + numberWithDouble: + numberWithFloat: + numberWithInt:

Foundation下大部分類均有簡便構(gòu)造方法,我們可以通過簡便構(gòu)造方法,獲得系統(tǒng)給我們創(chuàng)建好的對象,并且不需要手動(dòng)釋放。

42. 如何使用Xcode設(shè)計(jì)通用應(yīng)用?

答:使用MVC模式設(shè)計(jì)應(yīng)用,其中Model層完成脫離界面,即在Model層,其是可運(yùn)行在任何設(shè)備上,在controller層,根據(jù)iPhone與iPad(獨(dú)有UISplitViewController)的不同特點(diǎn)選擇不同的viewController對象。在View層,可根據(jù)現(xiàn)實(shí)要求,來設(shè)計(jì),其中以xib文件設(shè)計(jì)時(shí),其設(shè)置其為universal。

43. UIView的動(dòng)畫效果有那些?

答:有很多,如 UIViewAnimationOptionCurveEaseInOut UIViewAnimationOptionCurveEaseIn UIViewAnimationOptionCurveEaseOut UIViewAnimationOptionTransitionFlipFromLeft UIViewAnimationOptionTransitionFlipFromRight UIViewAnimationOptionTransitionCurlUpUIViewAnimationOptionTransitionCurlDown

44. 在iPhone應(yīng)用中如何保存數(shù)據(jù)?

答:有以下幾種保存機(jī)制:

1).通過web服務(wù),保存在服務(wù)器上

2).通過NSCoder固化機(jī)制,將對象保存在文件中

3).通過SQlite或CoreData保存在文件數(shù)據(jù)庫中

45. 什么是coredata?

答:coredata是蘋果提供一套數(shù)據(jù)保存框架,其基于SQlite

46. 什么是NSManagedObject模型?

答:NSManagedObject是NSObject的子類 ,也是coredata的重要組成部分,它是一個(gè)通用的類,實(shí)現(xiàn)了core data 模型層所需的基本功能,用戶可通過子類化NSManagedObject,建立自己的數(shù)據(jù)模型。

47. 什么是NSManagedobjectContext?

答:NSManagedobjectContext對象負(fù)責(zé)應(yīng)用和數(shù)據(jù)庫之間的交互。

48. 什么是謂詞?

答:謂詞是通過NSPredicate,是通過給定的邏輯條件作為約束條件,完成對數(shù)據(jù)的篩選。


predicate = [NSPredicate predicateWithFormat:@"customerID == %d",n];

a = [customers filteredArrayUsingPredicate:predicate];

49. 和coredata一起有哪幾種持久化存儲(chǔ)機(jī)制?

答:存入到文件、 存入到NSUserDefaults(系統(tǒng)plist文件中)、存入到Sqlite文件數(shù)據(jù)庫

50. 談?wù)剬lock 的理解?并寫出一個(gè)使用Block執(zhí)行UIVew動(dòng)畫?

答:Block是可以獲取其他函數(shù)局部變量的匿名函數(shù),其不但方便開發(fā),并且可以大幅提高應(yīng)用的執(zhí)行效率(多核心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的定義。

答:

1

2

typedef void(^animations) (void);

typedef void(^completion) (BOOL finished);

52. 試著使用+ beginAnimations:context:以及上述Block的定義,寫出一個(gè)可以完成


+ (void)transitionWithView:(UIView *)view duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion NS_AVAILABLE_IOS(4_0);

操作的函數(shù)執(zhí)行部分

答案:無

53. 做過的項(xiàng)目是否涉及網(wǎng)絡(luò)訪問功能,使用什么對象完成網(wǎng)絡(luò)功能?

答:ASIHTTPRequest與NSURLConnection

54. 簡單介紹下NSURLConnection類及+ sendSynchronousRequest:returningResponse:error:與– initWithRequest:delegate:兩個(gè)方法的區(qū)別?

答: NSURLConnection主要用于網(wǎng)絡(luò)訪問,其中+ sendSynchronousRequest:returningResponse:error:是同步訪問數(shù)據(jù),即當(dāng)前線程會(huì)阻塞,并等待request的返回的response,而– initWithRequest:delegate:使用的是異步加載,當(dāng)其完成網(wǎng)絡(luò)訪問后,會(huì)通過delegate回到主線程,并其委托的對象。

55. 多線程是什么

答: 多線程是個(gè)復(fù)雜的概念,按字面意思是同步完成多項(xiàng)任務(wù),提高了資源的使用效率,從硬件、操作系統(tǒng)、應(yīng)用軟件不同的角度去看,多線程被賦予不同的內(nèi)涵,對于硬件,現(xiàn)在市面上多數(shù)的CPU都是多核的,多核的CPU運(yùn)算多線程更為出色;從操作系統(tǒng)角度,是多任務(wù),現(xiàn)在用的主流操作系統(tǒng)都是多任務(wù)的,可以一邊聽歌、一邊寫博客;對于應(yīng)用來說,多線程可以讓應(yīng)用有更快的回應(yīng),可以在網(wǎng)絡(luò)下載時(shí),同時(shí)響應(yīng)用戶的觸摸操作。在iOS應(yīng)用中,對多線程最初的理解,就是并發(fā),它的含義是原來先做燒水,再摘菜,再炒菜的工作,會(huì)變成燒水的同時(shí)去摘菜,最后去炒菜。

56. iOS 中的多線程

答: iOS中的多線程,是Cocoa框架下的多線程,通過Cocoa的封裝,可以讓我們更為方便的使用線程,做過C++的同學(xué)可能會(huì)對線程有更多的理解,比如線程的創(chuàng)立,信號量、共享變量有認(rèn)識,Cocoa框架下會(huì)方便很多,它對線程做了封裝,有些封裝,可以讓我們創(chuàng)建的對象,本身便擁有線程,也就是線程的對象化抽象,從而減少我們的工程,提供程序的健壯性。

GCD是(Grand Central Dispatch)的縮寫 ,從系統(tǒng)級別提供的一個(gè)易用地多線程類庫,具有運(yùn)行時(shí)的特點(diǎn),能充分利用多核心硬件。GCD的API接口為C語言的函數(shù),函數(shù)參數(shù)中多數(shù)有Block,關(guān)于Block的使用參看這里,為我們提供強(qiáng)大的“接口”,對于GCD的使用參見本文

NSOperation與Queue

NSOperation是一個(gè)抽象類,它封裝了線程的細(xì)節(jié)實(shí)現(xiàn),我們可以通過子類化該對象,加上NSQueue來同面向?qū)ο蟮乃季S,管理多線程程序。具體可參看這里:一個(gè)基于NSOperation的多線程網(wǎng)絡(luò)訪問的項(xiàng)目。

NSThread

NSThread是一個(gè)控制線程執(zhí)行的對象,它不如NSOperation抽象,通過它我們可以方便的得到一個(gè)線程,并控制它。但NSThread的線程之間的并發(fā)控制,是需要我們自己來控制的,可以通過NSCondition實(shí)現(xiàn)。

參看 iOS多線程編程之NSThread的使用

其他多線程

在Cocoa的框架下,通知、Timer和異步函數(shù)等都有使用多線程,(待補(bǔ)充).

57. 在項(xiàng)目什么時(shí)候選擇使用GCD,什么時(shí)候選擇NSOperation?

答: 項(xiàng)目中使用NSOperation的優(yōu)點(diǎn)是NSOperation是對線程的高度抽象,在項(xiàng)目中使用它,會(huì)使項(xiàng)目的程序結(jié)構(gòu)更好,子類化NSOperation的設(shè)計(jì)思路,是具有面向?qū)ο蟮膬?yōu)點(diǎn)(復(fù)用、封裝),使得實(shí)現(xiàn)是多線程支持,而接口簡單,建議在復(fù)雜項(xiàng)目中使用。

項(xiàng)目中使用GCD的優(yōu)點(diǎn)是GCD本身非常簡單、易用,對于不復(fù)雜的多線程操作,會(huì)節(jié)省代碼量,而Block參數(shù)的使用,會(huì)是代碼更為易讀,建議在簡單項(xiàng)目中使用。

58. 什么是block

答: 對于閉包(block),有很多定義,其中閉包就是能夠讀取其它函數(shù)內(nèi)部變量的函數(shù),這個(gè)定義即接近本質(zhì)又較好理解。對于剛接觸Block的同學(xué),會(huì)覺得有些繞,因?yàn)槲覀兞?xí)慣寫這樣的程序main(){ funA();} funA(){funB();} funB(){…..}; 就是函數(shù)main調(diào)用函數(shù)A,函數(shù)A調(diào)用函數(shù)B… 函數(shù)們依次順序執(zhí)行,但現(xiàn)實(shí)中不全是這樣的,例如項(xiàng)目經(jīng)理M,手下有3個(gè)程序員A、B、C,當(dāng)他給程序員A安排實(shí)現(xiàn)功能F1時(shí),他并不等著A完成之后,再去安排B去實(shí)現(xiàn)F2,而是安排給A功能F1,B功能F2,C功能F3,然后可能去寫技術(shù)文檔,而當(dāng)A遇到問題時(shí),他會(huì)來找項(xiàng)目經(jīng)理M,當(dāng)B做完時(shí),會(huì)通知M,這就是一個(gè)異步執(zhí)行的例子。在這種情形下,Block便可大顯身手,因?yàn)樵陧?xiàng)目經(jīng)理M,給A安排工作時(shí),同時(shí)會(huì)告訴A若果遇到困難,如何能找到他報(bào)告問題(例如打他手機(jī)號),這就是項(xiàng)目經(jīng)理M給A的一個(gè)回調(diào)接口,要回掉的操作,比如接到電話,百度查詢后,返回網(wǎng)頁內(nèi)容給A,這就是一個(gè)Block,在M交待工作時(shí),已經(jīng)定義好,并且取得了F1的任務(wù)號(局部變量),卻是在當(dāng)A遇到問題時(shí),才調(diào)用執(zhí)行,跨函數(shù)在項(xiàng)目經(jīng)理M查詢百度,獲得結(jié)果后回調(diào)該block。

59. block 實(shí)現(xiàn)原理

答: Objective-C是對C語言的擴(kuò)展,block的實(shí)現(xiàn)是基于指針和函數(shù)指針。

從計(jì)算語言的發(fā)展,最早的goto,高級語言的指針,到面向?qū)ο笳Z言的block,從機(jī)器的思維,一步步接近人的思維,以方便開發(fā)人員更為高效、直接的描述出現(xiàn)實(shí)的邏輯(需求)。

使用實(shí)例

cocoaTouch框架下動(dòng)畫效果的Block的調(diào)用

使用typed聲明block


typedef void(^didFinishBlock) (NSObject *ob);

這就聲明了一個(gè)didFinishBlock類型的block,

然后便可用

1

@property (nonatomic,copy) didFinishBlock finishBlock;

聲明一個(gè)blokc對象,注意對象屬性設(shè)置為copy,接到block 參數(shù)時(shí),便會(huì)自動(dòng)復(fù)制一份。

__block是一種特殊類型,

使用該關(guān)鍵字聲明的局部變量,可以被block所改變,并且其在原函數(shù)中的值會(huì)被改變。

60.關(guān)于block

答: 面試時(shí),面試官會(huì)先問一些,是否了解block,是否使用過block,這些問題相當(dāng)于開場白,往往是下面一系列問題的開始,所以一定要如實(shí)根據(jù)自己的情況回答。

1). 使用block和使用delegate完成委托模式有什么優(yōu)點(diǎn)?

首先要了解什么是委托模式,委托模式在iOS中大量應(yīng)用,其在設(shè)計(jì)模式中是適配器模式中的對象適配器,Objective-C中使用id類型指向一切對象,使委托模式更為簡潔。了解委托模式的細(xì)節(jié):

iOS設(shè)計(jì)模式—-委托模式

使用block實(shí)現(xiàn)委托模式,其優(yōu)點(diǎn)是回調(diào)的block代碼塊定義在委托對象函數(shù)內(nèi)部,使代碼更為緊湊;

適配對象不再需要實(shí)現(xiàn)具體某個(gè)protocol,代碼更為簡潔。

2). 多線程與block

GCD與Block

使用 dispatch_async 系列方法,可以以指定的方式執(zhí)行block

GCD編程實(shí)例

dispatch_async的完整定義


void dispatch_async(

dispatch_queue_t queue,

dispatch_block_t block);

功能:在指定的隊(duì)列里提交一個(gè)異步執(zhí)行的block,不阻塞當(dāng)前線程

通過queue來控制block執(zhí)行的線程。主線程執(zhí)行前文定義的 finishBlock對象

1

dispatch_async(dispatch_get_main_queue(),^(void){finishBlock();});

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

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

  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,217評論 30 472
  • 之前看了很多面試題,感覺要不是不夠就是過于冗余,于是我將網(wǎng)上的一些面試題進(jìn)行了刪減和重排,現(xiàn)在分享給大家。(題...
    Job_Yang閱讀 12,111評論 12 143
  • 轉(zhuǎn):http://www.cocoachina.com/programmer/20151019/13746.htm...
    Style_偉閱讀 1,343評論 0 3
  • iOS面試小貼士 ———————————————回答好下面的足夠了------------------------...
    不言不愛閱讀 2,014評論 0 7
  • 人的一生究竟在追求什么?這是一個(gè)沒有標(biāo)準(zhǔn)答案的問題,一千個(gè)人可能會(huì)有一千個(gè)不同的回答,成功有很多種定義,有些人終生...
    龍翔虎躍閱讀 201評論 0 0