iOS面試題彙總

參考資料:html

http://blog.csdn.NET/xunyn/article/details/11073575java

http://blog.csdn.net/xunyn/article/details/8302787mysql

http://www.jianshu.com/p/4fea8fa60d75ios

http://www.csdn.Net/article/2015-01-19/2823604-iOS-interview-questionsgit

http://www.cnblogs.com/SharkBin/p/4618388.html程序員

 

1 面試的目的 
求職者經過表現證實本身對崗位的勝任
公司經過面試找到符合職位需求的員工
面試者面試的表現影響着公司用人選擇,對於軟件工程師,個人感受技術面試每每是「天王山」之戰,過去了BOSS面的時候,刷人機率不高,過不去,就得要找新的工做了。




2 面試的準備
如今大多數人對面試都挺重視的,我以爲也不該該簡單拒絕面試寶典類的東西(這片文章也是這一類的),感受軟件開發過程 涉及不少方面,很難在短期內對一我的完成全面的評估,舉個例子,好比高考,原本的目的是經過考試依靠分數選拔優秀學生去好大學,能力是基礎,但衡量是成績,那學生的最好方法,是根據考試來學習,這是個相對簡單的方法,而後就有了應試教育。工做面試也同樣,我的的能力、工做背景、項目經驗是基本,面試的技巧是應試技巧,面試技巧是表面文章,就像皮之不存,毛將焉附同樣?又不得不說的是誰都喜歡毛色靚麗的皮草。


着裝:
     小夥子乾淨利索  姑娘 隨意打扮,別濃妝豔抹就行


知識點:
     這裏我只列一些ios的主要知識點:
     objective -C 部分
     cocoaTouch 框架部分
     XCODE   使用部分 
     項目經驗部分 前三部分的內容,基本是按面試官考察面試者的知識點的掌握狀況,惟獨項目經驗,是面試者向面試官展現,能夠提早練習下項目介紹,作到有層次,有重點(根據不一樣的職位有不一樣的重點),例如,做爲軟件開發人員參與了iPad的點餐系統開發,完成了圖片菜單顯示的代碼,遇到了scroll view顯示大圖片效率問題,用懶加載的方式解決了該問題。
  


3 面試的過程
實事求是的答題
剛畢業求職時,特懼怕一道題目打不出來就直接被pass掉,這也是新手求職的過程,確實會遇到,若是是特別基礎題,建議回去增強基礎知識。但對於通常面試,一兩道題回答不出來,是很是正常的,在這樣技術信息不斷更新的時代,在牛的人技術都不能面面俱到。以我本身面試別人的經驗,senior些的面試官,都會了解面試人員確定有一些問題不瞭解,因此會從各個方面的問題都會涉及到,而後對面試者作一個綜合評價。對於面試過程當中,遇到本身不熟悉的領域,必定要實事求是,不瞭解就是不瞭解,瞭解一點就說一點,必定不要知道一點就裝資深,上來就是:這個知道,簡單的很,哪一個作過,不復雜。而後面試官繼續深刻的問些細的技術點,就開始找理由:"這個作過久了,那個模塊是別人實現的",這倒不要上升到道德誠信,由於面試過程總會有一些表面上的東西,從面試官的角度來講,首先他能面試你,通常是比你資深,其次面試的問題,面試官必定挑選過,因此在這上面抱着矇混過關的心理,是有點天真的。在本身擅長的技術點與面試官進行深層次的溝通,能獲得加分,技術點的知識都是能夠再學的,對於問題的抽象深度,每每決定一個程序員解決問題的能力。


答題的態度要謙虛
有些人不能說技術不強,對於知道的便惟他獨尊,不知道就覺不重要,視野侷限,例如一個iPhone程序員以前項目作的都是Native App,碰到面試官問他:HTML Hybrid框架的一些東西? 就顯出一副不屑一顧的輕視,說Html 5作出來的界面顯示速度慢,都是垃圾,先不說Html 5在跨平臺上的優點和已有網站業務的移動化升級等,面試官的問題頗有多是他的項目涉及這方面的技術,他是有主觀感覺的,主觀上會如何評價這位面試者?如俗語所說:「滿招損,謙得益」,謙虛的人,在項目中的團隊合做也會遇到較少障礙。




4 面試的心態
說下面試的心態,有些面試者,已經面試場特緊張,有的甚至聲音會發顫,這是很影響發揮的。對於有這樣的問題的,每每太想要這份工做,形成緊張過分,但生活中不止有一次機會,而即便此次面試很成功,也有可能最終拿不到offer,一份工做不全由一次面試決定,一我的的人生也不全由一份工做決定。如今社會發展愈來愈快,一次失敗每每是下一次工做機會的開始,因此去嘗試,總會有新的、更好的機會。


5 面試的後續
什麼樣面試是較成功的?個人理解,首先是面試官對你有興趣,表現就是回答面試官問題時,他聽的很仔細,聽完你的回答後,面試官還會講一些他對這個問題的見解,這樣的互動就很成功。


面試結束即是學習的一個新開端,不管是否拿到最終的offer,都已經花了時間去面試,對於面試中的問題的總結,就很是必要了。一些沒有答出來的題目,能夠在網上查查資料,把不清楚的問題搞清楚,提升我的能力。 github

 

隨着iOS平臺開發的職位的增長,筆試、面試也愈來愈有「套路」,這裏我總結了一些面試題,多數是Objective-C的基礎知識,適合於面試新人,答案是我本身答的,不許確的地方,歡迎指出。web

 

1.   Object-c的類能夠多重繼承麼?能夠實現多個接口麼?Category是什麼?重寫一個類的方式用繼承好仍是分類好?爲何?面試

Object-c的類不能夠多重繼承;能夠實現多個接口,經過實現多個接口能夠完成C++的多重繼承;Category是類別,通常狀況用分類好,用Category去重寫類的方法,僅對本Category有效,不會影響到其餘類與原有類的關係。objective-c

 

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 ? 在CODE上查看代碼片派生到個人代碼片
  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 ? 在CODE上查看代碼片派生到個人代碼片
  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: afterDelay: 或者使用GCD的函數:dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// 2秒後異步執行這裏的代碼...
});

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?
什麼是推送消息?
答案:。iOS中消息推送機制又叫消息機制,其包括兩類:一類是本地通知;另外一類是推送通知,也叫遠程通知。兩種通知在iOS中的表現一致,能夠經過橫幅或者彈出提醒兩種形式告訴用戶,而且點擊通知能夠會打開應用程序,可是實現原理卻徹底不一樣:本地通知是由本地應用觸發的,它是基於時間行爲的一種通知形式; 和本地通知不一樣,推送通知是由應用服務提供商發起的,經過蘋果的APNs(Apple Push Notification Server)發送到應用客戶端,以下圖









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方法,是協議UITableViewDataSource下的方法

必需實現的方法有tableView的section個數:- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

tableView的cell對象:- (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?

何時內存計數會增長?

答案:建立對象時和強引用retain該對象時

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, 原子和非原子操做,決定編譯器生成的setter getter是不是原子操做,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有哪幾種持久化存儲機制?

答案:這個問題問的是,coredate框架的存儲機制,平時使用coredata時,更多關注的是managed的對象,這裏是coerdata框架的存儲實現細節。BTW: 其餘經常使用的持久化存儲方法 :存入到文件、 存入到NSUserDefaults(系統plist文件中)。

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

答案:Block是能夠獲取其餘函數局部變量的匿名函數,其不但方便開發,而且能夠大幅提升應用的執行效率(多核心CPU可直接處理Block指令)

 

 

[cpp]  view plain  copy
 
 
 
  print ? 在CODE上查看代碼片派生到個人代碼片
  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實現的博文
 
 
3 block的使用
使用實例
 
使用typed聲明block
typedef void(^didFinishBlock) (NSObject *ob);
這就聲明瞭一個didFinishBlock類型的block,
而後即可用
@property (nonatomic,copy) didFinishBlock  finishBlock;
聲明一個block對象,注意對象屬性設置爲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
 
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實現。
 
 
其餘多線程
在Cocoa的框架下,通知、Timer和異步函數等都有使用多線程,(待補充).
 
 
 
3 iOS多線程常見面試題
在項目何時選擇使用GCD,何時選擇NSOperation?
項目中使用NSOperation的優勢是NSOperation是對線程的高度抽象,在項目中使用它,會使項目的程序結構更好,子類化NSOperation的設計思路,是具備面向對象的優勢(複用、封裝),使得實現是多線程支持,而接口簡單,建議在複雜項目中使用。
項目中使用GCD的優勢是GCD自己很是簡單、易用,對於不復雜的多線程操做,會節省代碼量,而Block參數的使用,會是代碼更爲易讀,建議在簡單項目中使用。

 

OneV‘s Den在博客裏出了10道iOS面試題,用他的話是:"列出了十個應聘Leader級別的高級Cocoa/CocoaTouch開發工程師所應該掌握和理解的技術" 。 
在這裏給一份個人答案。  
1. 你使用過Objective-C的運行時編程(Runtime Programming)麼?若是使用過,你用它作了什麼?你還能記得你所使用的相關的頭文件或者某些方法的名稱嗎?  
Objecitve-C的重要特性是Runtime(運行時),在#import <objc/runtime.h> 下能看到相關的方法,用過objc_getClass()和class_copyMethodList()獲取過私有API;使用  
```objective-c
Method method1 = class_getInstanceMethod(cls, sel1);
Method method2 = class_getInstanceMethod(cls, sel2);
method_exchangeImplementations(method1, method2);  
```   
代碼交換兩個方法,在寫unit test時使用到。  
2. 你實現過多線程的Core Data麼?NSPersistentStoreCoordinator,NSManagedObjectContext和NSManagedObject中的哪些須要在線程中建立或者傳遞?你是用什麼樣的策略來實現的?  
沒實現過多線程的CoreData(待實踐) 
<!--more--> 
3. Core開頭的系列的內容。是否使用過CoreAnimation和CoreGraphics。UI框架和CA,CG框架的聯繫是什麼?分別用CA和CG作過些什麼動畫或者圖像上的內容。(有須要的話還能夠涉及Quartz的一些內容)  
UI框架的底層有CoreAnimation,CoreAnimation的底層有CoreGraphics。    
UIKit | 
------------ | 
Core Animation | 
Core Graphics |
Graphics Hardware|  
使用CA作過menu菜單的展開收起(太遜了)  
4. 是否使用過CoreText或者CoreImage等?若是使用過,請談談你使用CoreText或者CoreImage的體驗。
CoreText能夠解決複雜文字內容排版問題。CoreImage能夠處理圖片,爲其添加各類效果。體驗是很強大,挺複雜的。
5. NSNotification和KVO的區別和用法是什麼?何時應該使用通知,何時應該使用KVO,它們的實現上有什麼區別嗎?若是用protocol和delegate(或者delegate的Array)來實現相似的功能可能嗎?若是可能,會有什麼潛在的問題?若是不能,爲何?(雖然protocol和delegate這種東西面試已經面爛了…)
NSNotification是通知模式在iOS的實現,KVO的全稱是鍵值觀察(Key-value observing),其是基於KVC(key-value coding)的,KVC是一個經過屬性名訪問屬性變量的機制。例如將Module層的變化,通知到多個Controller對象時,能夠使用NSNotification;若是是隻須要觀察某個對象的某個屬性,能夠使用KVO。
對於委託模式,在設計模式中是對象適配器模式,其是delegate是指向某個對象的,這是一對一的關係,而在通知模式中,每每是一對多的關係。委託模式,從技術上能夠如今改變delegate指向的對象,但不建議這樣作,會讓人迷惑,若是一個delegate對象不斷改變,指向不一樣的對象。  
6. 你用過NSOperationQueue麼?若是用過或者瞭解的話,你爲何要使用NSOperationQueue,實現了什麼?請描述它和GCD的區別和相似的地方(提示:能夠從二者的實現機制和適用範圍來描述)。
使用NSOperationQueue用來管理子類化的NSOperation對象,控制其線程併發數目。GCD和NSOperation均可以實現對線程的管理,區別是 NSOperation和NSOperationQueue是多線程的面向對象抽象。項目中使用NSOperation的優勢是NSOperation是對線程的高度抽象,在項目中使用它,會使項目的程序結構更好,子類化NSOperation的設計思路,是具備面向對象的優勢(複用、封裝),使得實現是多線程支持,而接口簡單,建議在複雜項目中使用。
項目中使用GCD的優勢是GCD自己很是簡單、易用,對於不復雜的多線程操做,會節省代碼量,而Block參數的使用,會是代碼更爲易讀,建議在簡單項目中使用。
更詳細的答案見個人這篇文章
7. 既然提到GCD,那麼問一下在使用GCD以及block時要注意些什麼?它們兩是一回事兒麼?block在ARC中和傳統的MRC中的行爲和用法有沒有什麼區別,須要注意些什麼?如何避免循環引用?
使用block是要注意,若將block作函數參數時,須要把它放到最後,GCD是Grand Central Dispatch,是一個對線程開源類庫,而Block是閉包,是可以讀取其餘函數內部變量的函數。更詳細的答案見個人這篇文章
8. 您是否作過異步的網絡處理和通信方面的工做?若是有,能具體介紹一些實現策略麼?
使用NSOperation發送異步網絡請求,使用NSOperationQueue管理線程數目及優先級,底層是用NSURLConnetion,詳細可見開源框架[LWConnetion](https://github.com/xunyn/LWConnetionDemo)。  
9. 對於Objective-C,你認爲它最大的優勢和最大的不足是什麼?對於不足之處,如今有沒有可用的方法繞過這些不足來實現需求。若是能夠的話,你有沒有考慮或者實踐太重新實現OC的一些功能,若是有,具體會如何作?
最大的優勢是它的運行時特性,不足是沒有命名空間,對於命名衝突,能夠使用長命名法或特殊前綴解決,若是是引入的第三方庫之間的命名衝突,能夠使用link命令及flag解決衝突。  
10. 你實現過一個框架或者庫以供別人使用麼?若是有,請談一談構建框架或者庫時候的經驗;若是沒有,請設想和設計框架的public的API,並指出大概須要如何作、須要注意一些什麼方面,來使別人容易地使用你的框架。
抽象和封裝,方便使用。首先是對問題有充分的瞭解,好比構建一個文件解壓壓縮框架,從使用者的角度出發,只需關注發送給框架一個解壓請求,框架完成複雜文件的解壓操做,而且在適當的時候通知給是哦難過者,如解壓完成、解壓出錯等。在框架內部去構建對象的關係,經過抽象讓其更爲健壯、便於更改。其次是API的說明文檔。  


這些問題,多數是沒有統一的正確答案的,問題有深度,又是在平時工做會用到的,很是適合你們一塊兒討論,

 

 

一個區分度很大的面試題

 

考察一個面試者基礎咋樣,基本上問一個 @property 就夠了:

@property 後面能夠有哪些修飾符?

  • 線程安全的:
    • atomic,nonatomic
  • 訪問權限的
    • readonly,readwrite
  • 內存管理(ARC)
    • assign,strong,weak,copy
  • 內存管理(MRC)
    • assign,retain,copy
  • 指定方法名稱
    • setter=
    • getter=

什麼狀況使用 weak 關鍵字,相比 assign 有什麼不一樣?好比:

  • 在ARC中,出現循環引用的時候,必需要有一端使用weak,好比:自定義View的代理屬性
  • 已經自身已經對它進行一次強應用,沒有必要在強引用一次,此時也會使用weak,自定義View的子控件屬性通常也使用weak;但b是也能夠使用strong
  • weak當對象銷燬的時候,指針會被自動設置爲nil,而assign不會* assigin 能夠用非OC對象,而weak必須用於OC對象

怎麼用 copy 關鍵字?

  • 對於字符串和block的屬性通常使用copy
  • 字符串使用copy是爲了外部把字符串內容改了,影響該屬性
  • block使用copy是在MRC遺留下來的,在MRC中,方法內部的block是在在棧區的,使用copy能夠把它放到堆區.在ACR中對於block使用copy仍是strong效果是同樣的

這個寫法會出什麼問題: @property (copy) NSMutableArray *array;

  • 添加,刪除,修改數組內的元素的時候,程序會由於找不到對於的方法而崩潰.由於copy就是複製一個不可變NSArray的對象

如何讓本身的類用 copy 修飾符?

  • 你是說讓個人類也支持copy的功能嗎?
  • 若是面試官說是:
    • 遵照NSCopying協議
    • 實現 - (id)copyWithZone:(NSZone *)zone; 方法
  • 若是面試官說否,是屬性中如何使用copy
    • 在使用字符串和block的時候通常都使用copy

如何重寫帶 copy 關鍵字的 setter?

  • 重寫copy的setter方法時候,必定要調用一下傳入的對象的copy方法,而後在賦值給該setter的方法對應的成員變量

這一套問題區分度比較大,若是上面的問題都能回答正確,能夠延伸問更深刻點的:

@property 的本質是什麼?ivar、getter、setter 是如何生成並添加到這個類中的
  • 在普通的OC對象中,@property就是編譯其自動幫咱們生成一個私有的成員變量和setter與getter方法的聲明和實現
  • 我爲了搞清屬性是怎麼實現的,曾經反編譯過相關的代碼,他大體生成了五個個東西
  • OBJC_IVAR_$類名$屬性名稱 該屬性的偏移量
  • setter與getter方法對應的實現函數
  • ivar_list 就是成員變量列表
  • method_list 方法列表
  • prop_list 屬性列表
    也就是說咱們每次在增長一個屬性,系統都會在ivar_list中添加一個成員變量的描述,在method_list中增長setter與getter方法的描述,在屬性列表中增長一個屬性的屬性的描述,而後計算該屬性在對象中的偏移量,而後伸出setter與getter方法對應的實現,在setter方法方法中從偏移量的位置開始賦值,在getter方法中從偏移量開始取值,爲了可以讀取正確字節數,系統對象偏移量的指針類型進行了類型強轉.
@protocol 和 category 中如何使用 @property
  1. 在protocol中使用property只會生成setter和getter方法聲明,咱們使用屬性的目的,是但願遵照我協議的對象的實現該屬性
  2. category 使用 @property 也是隻會生成setter和getter方法的聲明,若是咱們真的須要給category增長屬性的實現,須要藉助於運行時的兩個函數
    1. objc_setAssociatedObject
    2. objc_getAssociatedObject
runtime 如何實現 weak 屬性

runtime 對註冊的類, 會進行佈局,對於 weak 對象會放入一個 hash 表中。 用 weak 指向的對象地址做爲 key,當此對象的引用計數爲0的時候會 dealloc, 進而在這個 weak 表中找到此對象地址爲鍵的全部 weak 對象,從而設置爲 nil

每一個人擅長的領域不同,咱們通常會從簡歷上找本身寫擅長的技術聊,假如本身並非很熟,最好別寫出來或扯出來,萬一面試官恰好很是精通這裏就露餡了。

Checklist

總結過些面試題,沒堅持下去,後來把這些當 checklist,面試的時候實在沒話聊的時候作個提醒,語言、框架、運行機制性質的:

[※]@property中有哪些屬性關鍵字?

同上

[※]weak屬性須要在dealloc中置nil麼?

不須要,在ARC環境不管是強指針仍是弱指針都無需在deallco設置爲nil,ARC會自動幫咱們處理

[※※]@synthesize和@dynamic分別有什麼做用?

  1. @property有兩個對應的詞,一個是@synthesize,一個是@dynamic。若是@synthesize和@dynamic都沒寫,那麼默認的就是@syntheszie var = _var;
  2. @synthesize的語義是若是你沒有手動實現setter方法和getter方法,那麼編譯器會自動爲你加上這兩個方法。
  3. @dynamic告訴編譯器,屬性的setter與getter方法由用戶本身實現,不自動生成。(固然對於readonly的屬性只需提供getter便可)。假如一個屬性被聲明爲@dynamic var,而後你沒有提供@setter方法和@getter方法,編譯的時候沒問題,可是當程序運行到instance.var =someVar,因爲缺setter方法會致使程序崩潰;或者當運行到 someVar = var時,因爲缺getter方法一樣會致使崩潰。編譯時沒問題,運行時才執行相應的方法,這就是所謂的動態綁定。

[※※※]ARC下,不顯示指定任何屬性關鍵字時,默認的關鍵字都有哪些?

  1. 對應基本數據類型默認關鍵字是
    atomic,readwrite,assign
  2. 對於普通的OC對象
    atomic,readwrite,strong

[※※※]用@property聲明的NSString(或NSArray,NSDictionary)常用copy關鍵字,爲何?若是改用strong關鍵字,可能形成什麼問題?

  1. 由於父類指針能夠指向子類對象,使用copy的目的是爲了讓本對象的屬性不受外界影響,使用copy不管給我傳入是一個可變對象仍是不可對象,我自己持有的就是一個不可變的副本.
  2. 若是咱們使用是strong,那麼這個屬性就有可能指向一個可變對象,若是這個可變對象在外部被修改了,那麼會影響該屬性.

[※※※]@synthesize合成實例變量的規則是什麼?假如property名爲foo,存在一個名爲_foo的實例變量,那麼還會自動合成新變量麼?

若是沒有指定成員變量的名稱與自動生成一個屬性同名的成員變量,若是指定的成員變量的名稱,會生成一個指定的名稱的成員變量,若是這個成員已經存在了就再也不生成了.
若是是 @synthesize foo; 還會生成一個名稱爲foo的成員變量
若是是 @synthesize foo = _foo; 就不會生成成員變量了.

[※※※※※]在有了自動合成屬性實例變量以後,@synthesize還有哪些使用場景?

@synthesize主要就是用來生成setter,getter方法的實現,在@property被加強以後,其實已經不多使用@synthesize了,你知道@synthesize的其餘使用場景嗎? 能給我介紹一下嗎?
若是你聽懂了,感受面試官說的頗有道理,能夠說點讚美的話.

[※※]objc中向一個nil對象發送消息將會發生什麼?

  1. 在Objective-C中向nil發送消息是徹底有效的——只是在運行時不會有任何做用:
    • 若是一個方法返回值是一個對象,那麼發送給nil的消息將返回0(nil)。例如:Person * motherInlaw = [ aPerson spouse] mother];若是spouse對象爲nil,那麼發送給nil的消息mother也將返回nil。
    • 若是方法返回值爲指針類型,其指針大小爲小於或者等於sizeof(void*),float,double,long double 或者long long的整型標量,發送給nil的消息將返回0。
    • 若是方法返回值爲結構體,發送給nil的消息將返回0。結構體中各個字段的值將都是0。
    • 若是方法的返回值不是上述提到的幾種狀況,那麼發送給nil的消息的返回值將是未定義的。

[※※※]objc中向一個對象發送消息[obj foo]和objc_msgSend()函數之間有什麼關係?

該方法編譯以後就是objc_msgSend()函數調用.若是我沒有記錯的大概是這樣的.
((void ()(id, SEL))(void )objc_msgSend)((id)obj, sel_registerName("foo"));

[※※※]何時會報unrecognized selector的異常?

  • 當該對象上某個方法,而該對象上沒有實現這個方法的時候

    [※※※※]一個objc對象如何進行內存佈局?(考慮有父類的狀況)

  • 全部父類的成員變量和本身的成員變量都會存放在該對象所對應的存儲空間中.
  • 每個對象內部都一個isA指針,指向他的類對象,類對象中存放着本對象的對象方法列表和成員變量的列表,屬性列表,它內部也有一個isA指針指向元對象(meta class),元對象內部存放的是類方法列表,類對象內部還有一個superclass的指針,指向他的父類對象
  • 根對象就是NSobject
  • 如圖:

[※※※※]一個objc對象的isa的指針指向什麼?有什麼做用?

  • 指向他的類對象,從而能夠找到對象上的方法

[※※※※]下面的代碼輸出什麼?

@implementation Son : Father - (id)init { self = [super init]; if (self) { NSLog(@"%@", NSStringFromClass([self class])); NSLog(@"%@", NSStringFromClass([super class])); } return self; } @end

輸出的結果都是:Son,
緣由:super 和 self 都是指向的本實例對象的,
不一樣的是,super調用的跳過本類方法,調用父類的方法
父類方法的class方法原本都是在基類中實現的,因此不管使用self和super調用都是同樣的.
具體分析參照刨根問底Objective-C Runtime(1)- Self & Super

[※※※※]runtime如何經過selector找到對應的IMP地址?(分別考慮類方法和實例方法)

  • 每個類對象中都一個方法列表,方法列表中記錄着方法的名稱,方法實現,以及參數類型,其實selector本質就是方法名稱,經過這個方法名稱就能夠在方法列表中找到對應的方法實現.

[※※※※]使用runtime Associate方法關聯的對象,須要在主對象dealloc的時候釋放麼?

  • 在ARC下不須要
  • 在MRC中,對於使用retain或copy策略的須要

[※※※※※]objc中的類方法和實例方法有什麼本質區別和聯繫?

  • 類方法
    • 類方法是屬於類對象的
    • 類方法只能經過類對象調用
    • 類方法中的self是類對象
    • 類方法能夠調用其餘的類方法
    • 類方法中不能訪問成員變量
    • 類方法中不定直接調用對象方法
  • 實例方法
    • 實例方法是屬於實例對象的
    • 實例方法只能經過實例對象調用
    • 實例方法中的self是實例對象
    • 實例方法中能夠訪問成員變量
    • 實例方法中直接調用實例方法
    • 實例方法中也能夠調用類方法(經過類名)

[※※※※※]_objc_msgForward函數是作什麼的,直接調用它將會發生什麼?

  1. 沒喲研究過,從名字來看是用來轉發消息的,你能給我講講嗎?謝謝!

[※※※※※]runtime如何實現weak變量的自動置nil?

1. 沒有研究過,你有研究過嗎,能夠給我講講嗎? 2. 我猜系統會維護一個弱指針列表,當某個對象銷燬時候,它會把全部指向該對象的弱指針設置爲nil

[※※※※※]可否向編譯後獲得的類中增長實例變量?可否向運行時建立的類中添加實例變量?爲何?

由於編譯後的類已經註冊在 runtime 中,類結構體中的 objc_ivar_list 實例變量的鏈表 和 instance_size 實例變量的內存大小已經肯定,同時runtime 會調用 class_setIvarLayout 或 class_setWeakIvarLayout 來處理 strong weak 引用。因此不能向存在的類中添加實例變量, 運行時建立的類是能夠添加實例變量,調用 class_addIvar 函數。可是得在調用 objc_allocateClassPair 以後,objc_registerClassPair 以前,緣由同上。

[※※※]runloop和線程有什麼關係?

1. 每個線程中都一個runloop,只有主線的的runloop默認是開啓的,其餘線程的runloop是默認沒有開啓的 2. 能夠經過CFRunLoopRun() 函數來開啓一個事件循環 3. 看SDWebImage源碼的時候見到有這麼用過.

[※※※]runloop的mode做用是什麼?

model 主要是用來指定時間在運行循環中的優先級的
蘋果公開提供的 Mode 有兩個:
kCFRunLoopDefaultMode
kCFRunLoopCommonModes

若是咱們把一個NSTimer對象以kCFRunLoopDefaultMode添加到主運行循環中的時候,當一直有用戶事件處理的時候,NSTimer將再也不被調度
若是咱們把一個NSTimer對象以kCFRunLoopCommonModes添加到主運行循環中的時候,當一直有用戶事件處理的時候,NSTimer還能正常的調度,互不影響.

[※※※※]以+ scheduledTimerWithTimeInterval...的方式觸發的timer,在滑動頁面上的列表時,timer會暫定回調,爲何?如何解決?

同上

[※※※※※]猜測runloop內部是如何實現的?

1. 他是一個死循環 2.若是事件隊列中存放在事件,那就取出事件,執行相關代碼 3.若是沒有事件,就掛起,等有事件了,當即喚醒事件循環,開始執行. 簡單來講。。。 function loop() { initialize(); do { var message = get_next_message(); process_message(message); } while (message != quit); }

[※]objc使用什麼機制管理對象內存?

* MRC 手動引用計數 * ARC 自動引用計數,如今一般使用自動引用計數

[※※※※]ARC經過什麼方式幫助開發者管理內存?

經過編譯器在編譯的時候,插入如內管理的代碼

[※※※※]不手動指定autoreleasepool的前提下,一個autorealese對象在什麼時刻釋放?(好比在一個vc的viewDidLoad中建立)

在每次事件循環開始建立自動釋放池,在每次事件結束銷燬自動釋放池
以viewDidLoad方法爲例,能夠理解爲在viewDidLoad方法開始執行以前建立自動釋放池,
在viewDidLoad方法執行以後銷燬自動釋放吃

[※※※※]BAD_ACCESS在什麼狀況下出現?

1. 死循環了 2. 訪問一個殭屍對象

[※※※※※]蘋果是如何實現autoreleasepool的?

1. 我猜測autoreleasepool 本質就是一個隊列(數組), 2. 當調用autorelease的時候會把該對象添加到autoreleasepool中,而且把引用計數+1 3. 當autoreleasepool即將銷燬的時候,把其中的全部對象進行一次release操做

[※※]使用block時什麼狀況會發生引用循環,如何解決?

只要是一個對象對該block進行了強引用,在block內部有直接使用到該對象,

[※※]在block內如何修改block外部變量?

  1. 經過 __bock修改的外部變量,能夠在block內部修改
  2. 想裝B的話能夠說一下__bock內部作了什麼事

[※※※]使用系統的某些block api(如UIView的block版本寫動畫時),是否也考慮引用循環問題?

通常不用考慮,由於官方文檔中沒有告訴咱們要注意發生強引用,因此推測系統控件通常沒有對這些block進行強引用,因此咱們能夠不用考慮循環強引用的問題

[※※]GCD的隊列(dispatch_queue_t)分哪兩種類型?

串行隊列和並行隊列

[※※※※]如何用GCD同步若干個異步調用?(如根據若干個url異步加載多張圖片,而後在都下載完成後合成一張整圖)

整體上說:  使用 dispatch group,而後 wait forever 等待完成, 或者採起 group notify 來通知回調。 細節: 1. 建立異步隊列 2. 建立dispatch_group dispatch_group_t = dispatch_group_create() 3. 經過組來執行異步下載任務 dispatch_group_async(queueGroup, aQueue, ^{ NSLog(@"下載圖片."); }); 4.等到全部任務完成 dispatch_group_wait(queueGroup, DISPATCH_TIME_FOREVER); 5.合成圖片

[※※※※]dispatch_barrier_async的做用是什麼?

barrier:是障礙物的意思,在多個並行任務中間,他就像是一個隔離帶,把先後的並行任務分開. dispatch_barrier_async 做用是在並行隊列中,等待前面操做並行任務完成再執行dispatch_barrier_async中的任務,若是後面還有並行任務,會開始執行後續的並行任務
[※※※※※]蘋果爲何要廢棄dispatch_get_current_queue?
容易誤用形成死鎖

[※※※※※]如下代碼運行結果如何?

- (void)viewDidLoad
{
    [super viewDidLoad]; NSLog(@"1"); dispatch_sync(dispatch_get_main_queue(), ^{ NSLog(@"2"); }); NSLog(@"3"); }
  1. 只能輸出1,而後線程主線程死鎖

[※※]addObserver:forKeyPath:options:context:各個參數的做用分別是什麼,observer中須要實現哪一個方法才能得到KVO回調?

// 添加鍵值觀察 /** 1. 調用對象:要監聽的對象 2. 參數 1> 觀察者,負責處理監聽事件的對象 2> 觀察的屬性 3> 觀察的選項 4> 上下文 */ [self.person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:@"Person Name"];
// NSObject 分類方法,意味着全部的 NSObject 均可以實現這個方法! // 跟協議的方法很像,分類方法又能夠稱爲「隱式代理」!不提倡用,可是要知道概念! // 全部的 kvo 監聽到事件,都會調用此方法 /** 1. 觀察的屬性 2. 觀察的對象 3. change 屬性變化字典(新/舊) 4. 上下文,與監聽的時候傳遞的一致 能夠利用上下文區分不一樣的監聽! */ - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { NSLog(@"睡會 %@", [NSThread currentThread]); [NSThread sleepForTimeInterval:1.0]; NSLog(@"%@ %@ %@ %@", keyPath, object, change, context); }

[※※※]如何手動觸發一個value的KVO

1.經過setValue:forKey: 給屬性賦值 2.經過setValue:forKeyPath: 給屬性賦值 3.直接調用setter方法方法給屬性賦值 4.直接經過指針給屬性賦值 5. 給這個value設置一個值,就能夠觸發了

[※※※]若一個類有實例變量NSString *_foo,調用setValue:forKey:時,能夠以foo仍是_foo做爲key?

均可以

[※※※※]KVC的keyPath中的集合運算符如何使用?

1. 必須用在集合對象上或普通對象的集合屬性上
2. 簡單集合運算符有@avg, @count , @max , @min ,@sum, 3. 格式 @"@sum.age"或 @"集合屬性.@max.age"

[※※※※]KVC和KVO的keyPath必定是屬性麼?

1.一個能夠是成員變量

[※※※※※]如何關閉默認的KVO的默認實現,並進入自定義的KVO實現?

如何本身動手實現 KVO

[※※※※※]apple用什麼方式實現對一個對象的KVO?

同上

[※※]IBOutlet連出來的視圖屬性爲何能夠被設置成weak?

由於視圖已經對它有一個強引用了

[※※※※※]IB中User Defined Runtime Attributes如何使用?

User Defined Runtime Attributes 是一個不被看重但功能很是強大的的特性, 它可以經過KVC的方式配置一些你在interface builder 中不能配置的屬性。當你但願在IB中做盡量多得事情, 這個特性可以幫助你編寫更加輕量級的viewcontroller

[※※※]如何調試BAD_ACCESS錯誤

1.設置全局斷點快速定位問題代碼所在行

[※※※]lldb(gdb)經常使用的調試命令?

最經常使用就是 : po 對象

其餘的參照 淺談LLDB調試器

 

不管是對於公司仍是開發者或設計師我的而言,面試都是一項耗時耗錢的項目,本文做者Cameron Banga從編程、設計、App Store等各個方面對iOS開發者及設計師在面試時可能會遇到的問題進行了篩選與彙總。一方面,可以幫助HR在短期內獲取更多反饋信息,更好地甄選合適人選,而iOS開發者及設計師在尋找相關工做時,也可做爲參考,爲面試作好萬全準備。

 

常見問題

 

  • 你昨天/這周學習了什麼?
  • 你爲何熱衷於軟件開發?
  • 你對哪種控制系統比較熟悉?
  • 是否參與過GitHub項目?
  • 是否參與過GitHub或其餘同類型網站的iOS開源項目?
  • 請描述一下你的iOS應用開發流程。
  • 是否熟知CocoaPods?它是什麼?如何運行的?
  • 請歸納一下你對軟件受權的理解,及其對軟件開發的影響。
  • 請歸納一下你在構建iOS應用時的測試過程。iOS應用如何實現對其餘語言、日期格式以及貨幣單位的支持?
  • 請描述一下Instruments及其做用。

 

關於iOS技術

 

  • 請解釋一下Handoff是什麼,並簡述它是如何實現iOS、Mac/網頁應用互通的。
  • iCloud包含了哪些技術與服務?
  • iOS擴展是指?可否列舉一些熱門或常見的範例?
  • HealthKit是什麼?
  • HomeKit是什麼?
  • Apple Pay是什麼?可否描述一下如何在應用中使用Apple Pay?
  • 請解釋一下iOS應用沙盒機制。
  • VoiceOver是什麼?請舉例解釋一下iOS中的輔助功能(Accessibility)。開發者如何使用這些功能?
  • iOS應用是如何實現後臺多任務處理(Multitasking)的?
  • Game Center針對iOS遊戲有哪些功能?
  • iBeacons是什麼?
  • Cocoa/Cocoa Touch是什麼?
  • 請歸納一下Core Audio,Core Data以及Core Location各是什麼。它們對iOS應用有何意義?
  • 請描述SpriteKit和SceneKit的做用。
  • Metal是什麼?
  • 響應鏈(Responder Chain)是什麼?它是如何發揮做用的?
  • 按鈕和其餘控制方式對哪些操做作出迴應?
  • AppDelegate扮演着什麼樣的角色?
  • 請解釋一下NSUserDefaults。就你而言,你會如何在磁盤中對數組對象進行序列化?
  • 你會如何儲存用戶的認證信息?
  • 請問何爲Keychain服務?
  • 爲何移動設備上的緩存和壓縮是不可或缺的?
  • 請解釋一下~/Documents,~/Library和~/tmp。 iOS中的~屬於什麼目錄?
  • AirPlay是如何運行的?換作是你,你會如何經過編程提升應用的實用性以及演示效果?
  • 傳感器,IO以及WiFi、撥號等鏈接方式如何在iOS平臺上運做?它們有何利用價值?請扼要地談談你的觀點。
  • iPad 2,iPad mini 1-3,iPad Retina,iPad Air 2,iPhone 五、5S、6以及6+在硬件性能方面有何差別?這對注重性能的應用有何限制?

 

關於編程

 

  • Cocoa Touch包含什麼?不包含什麼?
  • 爲何Cocoa Touch的類名稱是以兩個大寫字母開頭的?
  • Swift和Objective-C分別是什麼?二者相比有何不一樣之處,又有何聯繫?
  • 爲何Optional在Swift語言中很是重要?
  • 請解釋一下NSError。在Swift中,什麼狀況下能使用NSError ,什麼狀況下不能?
  • 請說明如何使用Instancetype及其重要性。
  • 在Swift中,何時該用let,何時該用var?
  • 爲何map函數必不可少?該在什麼狀況下使用它?
  • 你會選擇什麼工具來追蹤Bug?
  • 若是在Cocoa中發現一個Bug,你會如何處理?
  • 若是應用的新版本出現了Regression的狀況,該如何補救?如何防止用戶在使用過程當中遇到新的Bug?
  • Objective-C的類是怎麼執行的?Objective-C Runtime是如何實現的?
  • iOS是如何提升安全性,保護用戶隱私信息的?
  • 應用能夠下載並即刻顯示數據。如何根據MVC來判斷下載的最佳位置?
  • MVC對代碼庫(Codebase)的設計有何影響?
  • Controller Life-Cycle以及View Life-cycle分別有哪些調試方法?
  • iOS使用的是哪些設計模式(Design Patterns)?你的代碼庫使用的是哪些設計模式?
  • iOS提供哪些線程?如何充分利用這些線程?
  • 請簡要描述一下UIScrollView的執行過程。它是如何響應手勢識別(Gesture Recognizer)、多點觸控(Multi-Touch)和Run Loop的?
  • 你認爲iOS須要添加或改進哪些API?

 

關於界面

 

  • iPhone五、六、6+以及iPad Air 2的屏幕分辨率分別是多少?
  • 分辨率的計算單位是什麼?
  • 請解釋一下Interface Builder的做用以及NIB文件的概念。
  • iOS UI的圖像儲存類型是什麼?
  • 請描述一下Storyboard和標準NIB文件的差異。
  • 設備狀態欄(Device Status Bar)是什麼?高度如何?是否透明?在手機通話或者導航狀態下,它是如何顯示的?
  • 導航欄(Navigation Bar)是什麼?可否拿出你的iPhone,指出你下載的哪些應用運用了導航欄?
  • 選項卡(Tab Bar)和工具欄(Toolbar)分別是什麼?二者之間有何共同點和不一樣點?
  • 表視圖(Table View)是什麼?集合視圖(Collection View)又是什麼?
  • 何時用「彈出(Popover)」屬性最爲合適?
  • Split-view Controller是什麼?
  • 選取器視圖(Picker View)適合存放哪類內容?
  • 應該在什麼狀況下使用標籤、文本域和文本視圖?
  • 分段控件(Segmented Control)的做用是什麼?
  • 模態視圖(Modal View)是什麼?
  • iOS通知屬於什麼類型?

 

關於設計

 

  • iOS應用圖標是指什麼?請儘量詳細地描述一下。
  • 最小尺寸和最大尺寸的應用圖標分別是什麼樣子的?
  • 應用圖標可否包含透明的部分?
  • Newsstand的圖標與常規應用有何不一樣?
  • 請解釋一下啓動畫面(Launch Images)。
  • 自動佈局(Auto Layout)的做用是什麼?請歸納一下它是如何運行的。
  • 設計軟件時爲何要加上動畫?
  • 請描述一下軟件設計中的交互和Feedback有什麼做用。
  • 設計iPhone和iPad應用時,應分別考慮哪些因素?
  • 請描述一下原型設計對於軟件開發的意義。其做用是什麼?

 

關於App Store

 

  • 應用內購買(In-App Purchases)是怎麼回事?IAP可以爲用戶帶來哪些新體驗?
  • 你是否在App Store上發佈過應用?可否歸納一下過程?
  • iTunes Connect是什麼?
  • Provisioning Profiles是指?
  • App ID是什麼?
  • iOS的開發和發佈簽名證書有何異同?
  • 如何使用TestFlight?經過Ad-hoc發佈應用的話,該如何使用UUID?
  • 應什麼時候驗證購買收據?
  • 發佈iAds(蘋果平臺廣告)有哪些要求?

 

趣味問答

 

  • 最近有沒有開發什麼好玩的東西?你最引覺得豪的做品是什麼?
  • 談一談你經常使用的開發工具都有哪些優點?
  • 你最敬佩的獨立Mac或者iOS應用開發者是誰?
  • 最喜歡什麼項目?哪一種類型的?
  • 你以爲Xcode有哪些須要改進的地方?
  • iOS上你最喜歡哪些API?
  • 是否有最中意的錯誤報告?
  • 你最愛以哪一種方式來檢驗一項新技術是否好用?
  • 爲何詞典被稱做Dictionaries,而不是HashTable或HashMap?

 

 

 

1 iOS基礎

1.1 父類實現深拷貝時,子類如何實現深度拷貝。父類沒有實現深拷貝時,子類如何實現深度拷貝。

  • 深拷貝同淺拷貝的區別:淺拷貝是指針拷貝,對一個對象進行淺拷貝,至關於對指向對象的指針進行復制,產生一個新的指向這個對象的指針,那麼就是有兩個指針指向同一個對象,這個對象銷燬後兩個指針都應該置空。深拷貝是對一個對象進行拷貝,至關於對對象進行復制,產生一個新的對象,那麼就有兩個指針分別指向兩個對象。當一個對象改變或者被銷燬後拷貝出來的新的對象不受影響。

  • 實現深拷貝須要實現NSCoying協議,實現- (id)copyWithZone:(NSZone *)zone 方法。當對一個property屬性含有copy修飾符的時候,在進行賦值操做的時候實際上就是調用這個方法。

  • 父類實現深拷貝以後,子類只要重寫copyWithZone方法,在方法內部調用父類的copyWithZone方法,以後實現本身的屬性的處理

  • 父類沒有實現深拷貝,子類除了須要對本身的屬性進行處理,還要對父類的屬性進行處理。

1.2 KVO,NSNotification,delegate及block區別

  • KVO就是cocoa框架實現的觀察者模式,通常同KVC搭配使用,經過KVO能夠監測一個值的變化,好比View的高度變化。是一對多的關係,一個值的變化會通知全部的觀察者。
  • NSNotification是通知,也是一對多的使用場景。在某些狀況下,KVO和NSNotification是同樣的,都是狀態變化以後告知對方。NSNotification的特色,就是須要被觀察者先主動發出通知,而後觀察者註冊監聽後再來進行響應,比KVO多了發送通知的一步,可是其優勢是監聽不侷限於屬性的變化,還能夠對多種多樣的狀態變化進行監聽,監聽範圍廣,使用也更靈活。

  • delegate 是代理,就是我不想作的事情交給別人作。好比狗須要吃飯,就經過delegate通知主人,主人就會給他作飯、盛飯、倒水,這些操做,這些狗都不須要關心,只須要調用delegate(代理人)就能夠了,由其餘類完成所須要的操做。因此delegate是一對一關係。

  • block是delegate的另外一種形式,是函數式編程的一種形式。使用場景跟delegate同樣,相比delegate更靈活,並且代理的實現更直觀。

  • KVO通常的使用場景是數據,需求是數據變化,好比股票價格變化,咱們通常使用KVO(觀察者模式)。delegate通常的使用場景是行爲,需求是須要別人幫我作一件事情,好比買賣股票,咱們通常使用delegate。
    Notification通常是進行全局通知,好比利好消息一出,通知你們去買入。delegate是強關聯,就是委託和代理雙方互相知道,你委託別人買股票你就須要知道經紀人,經紀人也不要知道本身的顧客。Notification是弱關聯,利好消息發出,你不須要知道是誰發的也能夠作出相應的反應,同理發消息的人也不須要知道接收的人也能夠正常發出消息。

1.3 KVC若是實現,如何進行鍵值查找。KVO如何實現

 

請看這兩篇博文 KVC KVO

1.4 將一個函數在主線程執行的4種方法

  • GCD方法,經過向主線程隊列發送一個block塊,使block裏的方法能夠在主線程中執行。
dispatch_async(dispatch_get_main_queue(), ^{ //須要執行的方法 });
  • NSOperation 方法
NSOperationQueue *mainQueue = [NSOperationQueue mainQueue]; //主隊列 NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ //須要執行的方法 }]; [mainQueue addOperation:operation];
  • NSThread 方法
[self performSelector:@selector(method) onThread:[NSThread mainThread] withObject:nil waitUntilDone:YES modes:nil]; [self performSelectorOnMainThread:@selector(method) withObject:nil waitUntilDone:YES]; [[NSThread mainThread] performSelector:@selector(method) withObject:nil];
  • RunLoop方法
[[NSRunLoop mainRunLoop] performSelector:@selector(method) withObject:nil]; 

1.5 如何讓計時器調用一個類方法

  • 計時器只能調用實例方法,可是能夠在這個實例方法裏面調用靜態方法。
  • 使用計時器須要注意,計時器必定要加入RunLoop中,而且選好model才能運行。scheduledTimerWithTimeInterval方法建立一個計時器並加入到RunLoop中因此能夠直接使用。
  • 若是計時器的repeats選擇YES說明這個計時器會重複執行,必定要在合適的時機調用計時器的invalid。不能在dealloc中調用,由於一旦設置爲repeats 爲yes,計時器會強持有self,致使dealloc永遠不會被調用,這個類就永遠沒法被釋放。好比能夠在viewDidDisappear中調用,這樣當類須要被回收的時候就能夠正常進入dealloc中了。
[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerMethod) userInfo:nil repeats:YES]; -(void)timerMethod { //調用類方法 [[self class] staticMethod]; } -(void)invalid { [timer invalid]; timer = nil; }

1.6 如何重寫類方法

  • 一、在子類中實現一個同基類名字同樣的靜態方法
  • 二、在調用的時候不要使用類名調用,而是使用[self class]的方式調用。原理,用類名調用是早綁定,在編譯期綁定,用[self class]是晚綁定,在運行時決定調用哪一個方法。

1.7 NSTimer建立後,會在哪一個線程運行。

  • 用scheduledTimerWithTimeInterval建立的,在哪一個線程建立就會被加入哪一個線程的RunLoop中就運行在哪一個線程
  • 本身建立的Timer,加入到哪一個線程的RunLoop中就運行在哪一個線程。

1.8 id和NSObject*的區別

  • id是一個 objc_object 結構體指針,定義是
typedef struct objc_object *id
  • id能夠理解爲指向對象的指針。全部oc的對象 id均可以指向,編譯器不會作類型檢查,id調用任何存在的方法都不會在編譯階段報錯,固然若是這個id指向的對象沒有這個方法,該崩潰仍是會崩潰的。

  • NSObject *指向的必須是NSObject的子類,調用的也只能是NSObjec裏面的方法不然就要作強制類型轉換。

  • 不是全部的OC對象都是NSObject的子類,還有一些繼承自NSProxy。NSObject *可指向的類型是id的子集。

個人理解若是有錯漏請必定指出,很是感謝!

如下內容後續補充

iOS 核心框架

  • CoreAnimation
  • CoreGraphics
  • CoreLocation
  • AVFoundation
  • Foundation

iOS核心機制

  • UITableView 重用
  • ObjC內存管理;自動釋放池,ARC如何實現
  • runloop
  • runtime
  • Block的定義、特性、內存區域、如何實現
  • Responder Chain
  • NSOperation
  • GCD

數據結構

  • 8大排序算法
  • 二叉樹實現
  • 二分查找實現

面向對象編程

  • 封裝、繼承、多態

  • 設計模式6個原則

  • 設計一個類的功能,如何劃分粒度(單一職責)

  • 接口隔離。

  • 若是有一個鳥類,有飛的動做,一個鴕鳥繼承它是合適的嗎(里氏替換)

  • 類之間的依賴如何依賴偶合度最小(依賴倒轉)
    高層依賴低層,低層不能依賴高層。依賴接口,不能依賴具體的類。

  • 若是A要調用C函數,但C是B的成員類,應該如何設計?(迪米特)

  • 如何設計類,能作到只增長代碼,而不修改代碼,有哪些經驗(開放封閉)
    經過設計模式解決。

計算機技術

  • 計算機網絡: TCP/IP、HTTPCDN、SPDY
  • 計算機安全: RSA、AES、DES
  • 操做系統:線程、進程、堆棧、死鎖、調度算法

iOS新特性、新技術

    • iOS7 UIDynamic、SpritKit、新佈局、扁平化
    • iOS8 應用程序擴展、HealthKit、SceneKit、CoreLocation、TouchID、PhotoKit
    • iOS9
    • Apple Watch
    • 第三方庫:SDWebImage、AFNetwork、JSONKit、wax
    • swift
相關文章
相關標籤/搜索