天天看點

面試 必備

随着iOS平台開發的職位的增加,筆試、面試也越來越有“套路”,這裡我總結了一些面試題,多數是Objective-C的基礎知識,适合于面試新人,答案是我自己答的,不準确的地方,歡迎指出。

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 各是什麼作用,在那種情況下用?

readwrite 是可讀可寫特性;需要生成getter方法和setter方法時

readonly 是隻讀特性  隻會生成getter方法 不會生成setter方法 ;不希望屬性在類外改變

assign 是指派特性,setter方法将傳入參數指派給執行個體變量;僅設定變量時;

retain 表示持有特性,setter方法将傳入參數先保留,再指派,傳入參數的retaincount會+1;

copy 表示拷貝特性,setter方法将傳入對象複制一份;需要完全一份新的變量時。

nonatomic 非原子操作,決定編譯器生成的setter getter是否是原子操作,atomic表示多線程安全,一般使用nonatomic

4.寫一個setter方法用于完成@property (nonatomic,retain)NSString *name,寫一個setter方法用于完成@property(nonatomic,copy)NSString *name

[cpp] ​​view plain​​​​copy​​​​print​​​​?​​​​​​​​​​

1. - (void) setName:(NSString*) str
2. {
3. [str retain];
4. [name release];
5. name = str;
6. }
7. - (void)setName:(NSString *)str
8. {
9. id t = [str copy];
10. [name release];
11. name = t;
12. }      

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(自動記憶體計數)、手動記憶體計數、記憶體池。

9.記憶體管理的幾條原則時什麼?按照預設法則.那些關鍵字生成的對象

需要手動釋放?在和property結合的時候怎樣有效的避免記憶體洩露?

誰申請,誰釋放

遵循Cocoa Touch的使用原則;

記憶體管理主要要避免“過早釋放”和“記憶體洩漏”,對于“過早釋放”需要注意@property設定特性時,一定要用對特性關鍵字,對于“記憶體洩漏”,一定要申請了要負責釋放,要細心。

關鍵字alloc 或new 生成的對象需要手動釋放;

設定正确的property屬性,對于retain需要在合适的地方釋放,

10.如何對iOS裝置進行性能測試?

Profile-> Instruments ->Time Profiler

11.看下面的程式,第一個NSLog會輸出什麼?這時str的retainCount是多少?第二個和第三個呢? 為什麼?

[cpp] ​​view plain​​​​copy​​​​print​​​​?​​​​​​​​​​

1. =======================================================
2. NSMutableArray* ary = [[NSMutableArray array] retain];
3. NSString *str = [NSString stringWithFormat:@"test"];
4. [strretain];
5. [aryaddObject:str];
6. NSLog(@"%@%d",str,[str retainCount]);
7. [strretain];
8. [strrelease];
9. [strrelease];
10. NSLog(@"%@%d",str,[str retainCount]);
11. [aryremoveAllObjects];
12. NSLog(@"%@%d",str,[str retainCount]);
13. =======================================================      

str的retainCount建立+1,retain+1,加入數組自動+1

3

retain+1,release-1,release-1

2

數組删除所有對象,所有數組内的對象自動-1

1

12. Object C中建立線程的方法是什麼?如果在主線程中執行代碼,方法是什麼?如果想延時執行代碼、方法又是什麼?

線程建立有三種方法:使用NSThread建立、使用GCD的dispatch、使用子類化的NSOperation,然後将其加入NSOperationQueue;在主線程執行代碼,方法是performSelectorOnMainThread,如果想延時執行代碼可以用performSelector:onThread:withObject:waitUntilDone:

13.描述一下iOS SDK中如何實作MVC的開發模式

MVC是模型、試圖、控制開發模式,對于iOS SDK,所有的View都是視圖層的,它應該獨立于模型層,由視圖控制層來控制。所有的使用者資料都是模型層,它應該獨立于視圖。所有的ViewController都是控制層,由它負責控制視圖,通路模型資料。

1.Difference between shallow copy and deep copy?

淺複制和深複制的差別?

答案:淺層複制:隻複制指向對象的指針,而不複制引用對象本身。

深層複制:複制引用對象本身。

意思就是說我有個A對象,複制一份後得到A_copy對象後,對于淺複制來說,A和A_copy指向的是同一個記憶體資源,複制的隻不過是是一個指針,對象本身資源

還是隻有一份,那如果我們對A_copy執行了修改操作,那麼發現A引用的對象同樣被修改,這其實違背了我們複制拷貝的一個思想。深複制就好了解了,記憶體中存在了

兩份獨立對象本身。

用網上一哥們通俗的話将就是:

淺複制好比你和你的影子,你完蛋,你的影子也完蛋

深複制好比你和你的克隆人,你完蛋,你的克隆人還活着。

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

類别的作用?繼承和類别在實作中有何差別?

答案:category 可以在不獲悉,不改變原來代碼的情況下往裡面添加新的方法,隻能添加,不能删除修改。

并且如果類别和原來類中的方法産生名稱沖突,則類别将覆寫原來的方法,因為類别具有更高的優先級。

類别主要有3個作用:

(1)将類的實作分散到多個不同檔案或多個不同架構中。

(2)建立對私有方法的前向引用。

(3)向對象添加非正式協定。

 繼承可以增加,修改或者删除方法,并且可以增加屬性。

3.Difference between categories and extensions?

類别和類擴充的差別。

 答案:category和extensions的不同在于 後者可以添加屬性。另外後者添加的方法是必須要實作的。

extensions可以認為是一個私有的Category。

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

oc中的協定和java中的接口概念有何不同?

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

informal protocol中的方法屬于設計模式考慮範疇,不是必須實作的,但是如果有實作,就會改變類的屬性。

其實關于正式協定,類别和非正式協定我很早前學習的時候大緻看過,也寫在了學習教程裡

“非正式協定概念其實就是類别的另一種表達方式“這裡有一些你可能希望實作的方法,你可以使用他們更好的完成工作”。

這個意思是,這些是可選的。比如我門要一個更好的方法,我們就會申明一個這樣的類别去實作。然後你在後期可以直接使用這些更好的方法。

這麼看,總覺得類别這玩意兒有點像協定的可選協定。"

現在來看,其實protocal已經開始對兩者都統一和規範起來操作,因為資料中說“非正式協定使用interface修飾“,

現在我們看到協定中兩個修飾詞:“必須實作(@requied)”和“可選實作(@optional)”。

OC中的協定(formal protocol)與java中的接口概念基本一緻,OC中非正式協定(informal protocol)就是類别。在java中如果繼承了接口,但不實作其方法,會得到一個error(無法編譯);在OC中的正式協定,如果不實作,會得到一個warning(可編譯執行),如果想去除waring,還可以加關鍵字(@optional),讓它可選實作方法。

5.What are KVO and KVC?

答案:kvc:鍵 - 值編碼是一種間接通路對象的屬性使用字元串來辨別屬性,而不是通過調用存取方法,直接或通過執行個體變量通路的機制。

很多情況下可以簡化程式代碼。apple文檔其實給了一個很好的例子。

kvo:鍵值觀察機制,他提供了觀察某一屬性變化的方法,極大的簡化了代碼。

具體用看到嗯哼用到過的一個地方是對于按鈕點選變化狀态的的監控。

比如我自定義的一個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]; 
    } 
}      

對于系統是根據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查找的邏輯了解,就說的過去了。

6.What is purpose of delegates?

代理的作用?

答案:代理的目的是改變或傳遞控制鍊。允許一個類在某些特定時刻通知到其他類,而不需要擷取到那些類的指針。可以減少架構複雜度。

另外一點,代理可以了解為java中的回調監聽機制的一種類似。

7.What are mutable and immutable types in Objective C?

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

答案:可修改不可修改的集合類。這個我個人簡單了解就是可動态添加修改和不可動态添加修改一樣。

比如NSArray和NSMutableArray。前者在初始化後的記憶體控件就是固定不可變的,後者可以添加等,可以動态申請新的記憶體空間。

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

我們說的oc是動态運作時語言是什麼意思?

答案:多态。 主要是将資料類型的确定由編譯時,推遲到了運作時。

這個問題其實淺涉及到兩個概念,運作時和多态。

簡單來說,運作時機制使我們直到運作時才去決定一個對象的類别,以及調用該類别對象指定方法。

多态:不同對象以自己的方式響應相同的消息的能力叫做多态。意思就是假設生物類(life)都用有一個相同的方法-eat;

那人類屬于生物,豬也屬于生物,都繼承了life後,實作各自的eat,但是調用是我們隻需調用各自的eat方法。

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

是以也可以說,運作時機制是多态的基礎?~~~

9.what is difference between NSNotification and protocol?

通知和協定的不同之處?

答案:協定有控制鍊(has-a)的關系,通知沒有。

首先我一開始也不太明白,什麼叫控制鍊(專業術語了~)。但是簡單分析下通知和代理的行為模式,我們大緻可以有自己的了解

簡單來說,通知的話,它可以一對多,一條消息可以發送給多個消息接受者。

代理按我們的了解,到不是直接說不能一對多,比如我們知道的明星經濟代理人,很多時候一個經濟人負責好幾個明星的事務。

隻是對于不同明星間,代理的事物對象都是不一樣的,一一對應,不可能說明天要處理A明星要一個釋出會,代理人發出處理釋出會的消息後,别稱B的

釋出會了。但是通知就不一樣,他隻關心發出通知,而不關心多少接收到感興趣要處理。

是以控制鍊(has-a從英語單詞大緻可以看出,單一擁有和可控制的對應關系。

10.What is push notification?

什麼是推送消息?

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

這是cocoa上的答案。

其實到不是說太簡單,隻是太泛泛的一個概念的東西。就好比說,什麼是人。

推送通知更是一種技術。

簡單點就是用戶端擷取資源的一種手段。

普通情況下,都是用戶端主動的pull。

推送則是伺服器端主動push。 ​​​測試push的實作可以檢視該博文。​​

11.Polymorphism?

關于多态性

答案:多态,子類指針可以指派給父類。

這個題目其實可以出到一切面向對象語言中,

是以關于多态,繼承和封裝基本最好都有個自我意識的了解,也并非一定要把書上資料上寫的能背出來。

最重要的是轉化成自我了解。

12.Singleton?

對于單例的了解

答案:11,12題目其實出的有點泛泛的感覺了,可能說是​​​程式設計​​​語言需要或是必備的基礎。

基本能用熟悉的語言寫出一個單例,以及可以運用到的場景或是你程式設計中碰到過運用的此種模式的架構類等。

進一步點,考慮下如何在多線程通路單例時的安全性。

13.What is responder chain?

說說響應鍊

答案: 事件響應鍊。包括點選事件,畫面重新整理事件等。在視圖棧内從上至下,或者從下之上傳播。

可以說點事件的分發,傳遞以及處理。具體可以去看下touch事件這塊。因為問的太抽象化了

嚴重懷疑題目出到越後面就越籠統。

可以從責任鍊模式,來講通過事件響應鍊處理,其擁有的擴充性

14.Difference between frame and bounds?

frame和bounds有什麼不同?

答案:frame指的是:該view在父view坐标系統中的位置和大小。(參照點是父親的坐标系統)

bounds指的是:該view在本身坐标系統中 的位置和大小。(參照點是本身坐标系統)

15.Difference between method and selector?

方法和選擇器有何不同?

答案:selector是一個方法的名字,method是一個組合體,包含了名字和實作.

詳情可以看apple文檔。

16.Is there any garbage collection mechanism in Objective C.?

OC的垃圾回收機制?

答案: OC2.0有Garbage collection,但是iOS平台不提供。

一般我們了解的objective-c對于記憶體管理都是手動操作的,但是也有自動釋放池。

但是差了大部分資料,貌似不要和arc機制搞混就好了。

求更多~~

17.NSOperation queue?

答案:存放NSOperation的集合類。

操作和操作隊列,基本可以看成java中的線程和線程池的概念。用于處理ios多線程開發的問題。

網上部分資料提到一點是,雖然是queue,但是卻并不是帶有隊列的概念,放入的操作并非是按照嚴格的先進現出。

這邊又有個疑點是,對于隊列來說,先進先出的概念是Afunc添加進隊列,Bfunc緊跟着也進入隊列,Afunc先執行這個是必然的,

但是Bfunc是等Afunc完全操作完以後,B才開始啟動并且執行,是以隊列的概念理論上有點違背了多線程處理這個概念。

但是轉念一想其實可以參考銀行的取票和叫号系統。

是以對于A比B先排隊取票但是B率先執行完操作,我們亦然可以感性認為這還是一個隊列。

但是後來看到一票關于這操作隊列話題的文章,其中有一句提到

“因為兩個操作送出的時間間隔很近,線程池中的線程,誰先啟動是不定的。”

瞬間覺得這個queue名字有點忽悠人了,還不如pool~

綜合一點,我們知道他可以比較大的用處在于可以幫助多線程程式設計就好了。

樓上區分了線程執行時的次序(Afunc和Bfunc誰先啟動)和線程執行完成(Afunc和Bfunc誰先執行完)時的次序不同,而多線程的重要概念是并發(同時執行多個任務),NSOperationQueue是管理并發線程的對象,可以在其中放入NSOpertation對象(對象化的線程實體),通過設定maxConcurrentOperationCount的大小,控制并發數目,如樓上所說希望“Afunc添加進隊列,執行完後,Bfunc緊跟進入隊列,繼續執行”,那隻需将maxConcurrentOperationCount設為1,變會依次執行,這時候實際是在單線程依次執行。是以這裡的NSOperationQueue就是對象化抽象的去管理多線程,這樣的好處,使用者通過繼承NSOperation對象,可以友善的用對象來管理線程,而不再用關心線程同步、信号量等細節,更多地關注于業務邏輯。

18.What is lazy loading?

答案:懶漢模式,隻在用到的時候才去初始化。

也可以了解成延時加載。

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

一個延時載,避免記憶體過高,一個異步加載,避免線程堵塞。

19.Can we use two tableview controllers on one viewcontroller?

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

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

隻能說可以嵌入一個tableview視圖。當然,題目本身也有歧義,如果不是我們定性思維認為的UIViewController,

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

那樣的感覺。

20.Can we use one tableview with two different datasources? How you will achieve this?

一個tableView是否可以關聯兩個不同的資料源?你會怎麼處理?

答案:首先我們從代碼來看,資料源如何關聯上的,其實是在資料源關聯的代理方法裡實作的。

是以我們并不關心如何去關聯他,他怎麼關聯上,方法隻是讓我傳回根據自己的需要去設定如相關的資料源。

是以,我覺得可以設定多個資料源啊,但是有個問題是,你這是想幹嘛呢?想讓清單如何顯示,不同的資料源分區塊顯示?

1.When to use NSMutableArray and when to use NSArray? 

什麼時候使用NSMutableArray,什麼時候使用NSArray?

答案:當數組在程式運作時,需要不斷變化的,使用NSMutableArray,當數組在初始化後,便不再改變的,使用NSArray。需要指出的是,使用NSArray隻表明的是該數組在運作時不發生改變,即不能往NSAarry的數組裡新增和删除元素,但不表明其數組內的元素的内容不能發生改變。NSArray是線程安全的,NSMutableArray不是線程安全的,多線程使用到NSMutableArray需要注意。

2.Give us example of what are delegate methods and what are data source methods of uitableview.

給出委托方法的執行個體,并且說出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;

3.How many autorelease you can create in your application? Is there any limit?

在應用中可以建立多少autorelease對象,是否有限制?

答案:無

4.If we don’t create any autorelease pool in our application then is there any autorelease pool already provided to us?

如果我們不建立記憶體池,是否有記憶體池提供給我們?

答案:界面線程維護着自己的記憶體池,使用者自己建立的資料線程,則需要建立該線程的記憶體池

5.When you will create an autorelease pool in your application?

什麼時候需要在程式中建立記憶體池?

答案:使用者自己建立的資料線程,則需要建立該線程的記憶體池

6.When retain count increase?

什麼時候記憶體計數會增加?

答案:​​見iOS面試題(一)​​

7.What are commonly used NSObject class methods?

類NSObject的那些方法經常被使用?

答案:NSObject是Objetive-C的基類,其由NSObject類及一系列協定構成。

其中類方法alloc、class、 description 對象方法init、dealloc、– performSelector:withObject:afterDelay:等經常被使用 

8.What is convenience constructor?

什麼是簡便構造方法?

答案:簡便構造方法一般由CocoaTouch架構提供,如NSNumber的 + numberWithBool:  + numberWithChar:  + numberWithDouble:  + numberWithFloat:  + numberWithInt:

Foundation下大部分類均有簡便構造方法,我們可以通過簡便構造方法,獲得系統給我們建立好的對象,并且不需要手動釋放。

9.How to design universal application in Xcode?

如何使用Xcode設計通用應用?

答案:使用MVC模式設計應用,其中Model層完成脫離界面,即在Model層,其是可運作在任何裝置上,在controller層,根據iPhone與iPad(獨有UISplitViewController)的不同特點選擇不同的viewController對象。在View層,可根據現實要求,來設計,其中以xib檔案設計時,其設定其為universal。

10.What is keyword atomic in Objective C?

在Objetive-C什麼時原子關鍵字

答案:atomic,nonatomic

11.What are UIView animations?

UIView的動畫效果有那些?

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

12.How can you store data in iPhone applications?

在iPhone應用中如何儲存資料?

答案:有以下幾種儲存機制:

1.通過web服務,儲存在伺服器上

2.通過NSCoder固化機制,将對象儲存在檔案中

3.通過SQlite或CoreData儲存在檔案資料庫中

13.What is coredata?

什麼是coredata?

答案:coredata架構是apple提供的一套通用自動的解決方案,包括了對象生存周期、對象關系圖、持久化機制。

補充答案:上面是翻譯的,按我個人了解coredata提供一種一機制,讓我們可以友善的把記憶體中對象,及對象間的關系,映射到coredata,然後由它為我們持久化資料。相比普通的檔案資料庫SQlite,它的功能更強大,不需要我們先将對象資料format成SQL語句,存入資料庫,再用select語句讀出,而現在是從記憶體到coredata的資料管理,我們隻需管理coredata的managed對象。

是蘋果提供一套資料儲存

14.What is NSManagedObject model?

什麼是NSManagedObject模型?

答案:NSManagedObject是NSObject的子類 ,也是coredata的重要組成部分,它是一個通用的類,實作了core data 模型層所需的基本功能,使用者可通過子類化NSManagedObject,建立自己的資料模型。

15.What is NSManagedobjectContext?

什麼是NSManagedobjectContext?

答案:NSManagedobjectContext對象負責應用和資料庫之間的互動。

16.What is predicate?

什麼是謂詞?

答案:謂詞是通過NSPredicate,是通過給定的邏輯條件作為限制條件,完成對資料的篩選。

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

    a = [customers filteredArrayUsingPredicate:predicate];

17.What kind of persistence store we can use with coredata?

coredata有哪幾種持久化存儲機制?

答案:coredatat提供以下幾種存儲機制:XML(iOS系統不支援),自動存儲,SQLite,記憶體存儲。 

補充說明:這個問題問的是,coredate架構的存儲機制,平時使用coredata時,更多關注的是managed的對象,這裡是coerdata架構的存儲實作細節。BTW: 其他常用的持久化存儲方法 :存入到檔案、 存入到NSUserDefaults(系統plist檔案中)。

1 談談對Block 的了解?并寫出一個使用Block執行UIVew動畫?

答案:Block是可以擷取其他函數局部變量的匿名函數,其不但友善開發,并且可以大幅提高應用的執行效率(多核心CPU可直接處理Block指令)

[cpp] ​​view plain​​​​copy​​​​print​​​​?​​​​​​​​​​

  1. [UIView transitionWithView:self.view
  2. duration:0.2
  3. options:UIViewAnimationOptionTransitionFlipFromLeft
  4. animations:^{ [[blueViewController view] removeFromSuperview]; [[self view] insertSubview:yellowViewController.view atIndex:0]; }
  5. completion:NULL];

2 寫出上面代碼的Block的定義。

答案:

typedef void(^animations) (void);

typedef void(^completion) (BOOL finished);

3 試着使用+ 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);操作的函數執行部分

答案:無

網絡部分

3 做過的項目是否涉及網絡通路功能,使用什麼對象完成網絡功能?

答案:ASIHTTPRequest與NSURLConnection

4 簡單介紹下NSURLConnection類及+ sendSynchronousRequest:returningResponse:error:與– initWithRequest:delegate:兩個方法的差別?

答案:  NSURLConnection主要用于網絡通路,其中+ sendSynchronousRequest:returningResponse:error:是同步通路資料,即目前線程會阻塞,并等待request的傳回的response,而– initWithRequest:delegate:使用的是異步加載,當其完成網絡通路後,會通過delegate回到主線程,并其委托的對象。

多線程部分

1 什麼是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。

2 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();}); 

1 多線程是什麼 

多線程是個複雜的概念,按字面意思是同步完成多項任務,提高了資源的使用效率,從硬體、作業系統、應用軟體不同的角度去看,多線程被賦予不同的内涵,對于硬體,現在市面上多數的CPU都是多核的,多核的CPU運算多線程更為出色;從作業系統角度,是多任務,現在用的主流作業系統都是多任務的,可以一邊聽歌、一邊寫部落格;對于應用來說,多線程可以讓應用有更快的回應,可以在網絡下載下傳時,同時響應使用者的觸摸操作。在iOS應用中,對多線程最初的了解,就是并發,它的含義是原來先做燒水,再摘菜,再炒菜的工作,會變成燒水的同時去摘菜,最後去炒菜。

2 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和異步函數等都有使用多線程,(待補充).

3 iOS多線程常見面試題

在項目什麼時候選擇使用GCD,什麼時候選擇NSOperation?

項目中使用NSOperation的優點是NSOperation是對線程的高度抽象,在項目中使用它,會使項目的程式結構更好,子類化NSOperation的設計思路,是具有面向對象的優點(複用、封裝),使得實作是多線程支援,而接口簡單,建議在複雜項目中使用。

項目中使用GCD的優點是GCD本身非常簡單、易用,對于不複雜的多線程操作,會節省代碼量,而Block參數的使用,會是代碼更為易讀,建議在簡單項目中使用。