參考資料: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
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是多少?第二個和第三個呢? 爲何?
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指令)
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
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 就夠了:
runtime 對註冊的類, 會進行佈局,對於 weak 對象會放入一個 hash 表中。 用 weak 指向的對象地址做爲 key,當此對象的引用計數爲0的時候會 dealloc, 進而在這個 weak 表中找到此對象地址爲鍵的全部 weak 對象,從而設置爲 nil
每一個人擅長的領域不同,咱們通常會從簡歷上找本身寫擅長的技術聊,假如本身並非很熟,最好別寫出來或扯出來,萬一面試官恰好很是精通這裏就露餡了。
總結過些面試題,沒堅持下去,後來把這些當 checklist,面試的時候實在沒話聊的時候作個提醒,語言、框架、運行機制性質的:
同上
不須要,在ARC環境不管是強指針仍是弱指針都無需在deallco設置爲nil,ARC會自動幫咱們處理
若是沒有指定成員變量的名稱與自動生成一個屬性同名的成員變量,若是指定的成員變量的名稱,會生成一個指定的名稱的成員變量,若是這個成員已經存在了就再也不生成了.
若是是 @synthesize foo; 還會生成一個名稱爲foo的成員變量
若是是 @synthesize foo = _foo; 就不會生成成員變量了.
@synthesize主要就是用來生成setter,getter方法的實現,在@property被加強以後,其實已經不多使用@synthesize了,你知道@synthesize的其餘使用場景嗎? 能給我介紹一下嗎?
若是你聽懂了,感受面試官說的頗有道理,能夠說點讚美的話.
該方法編譯以後就是objc_msgSend()函數調用.若是我沒有記錯的大概是這樣的.
((void ()(id, SEL))(void )objc_msgSend)((id)obj, sel_registerName("foo"));
[※※※※]下面的代碼輸出什麼?
@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
[※※※※※]objc中的類方法和實例方法有什麼本質區別和聯繫?
1. 沒有研究過,你有研究過嗎,能夠給我講講嗎? 2. 我猜系統會維護一個弱指針列表,當某個對象銷燬時候,它會把全部指向該對象的弱指針設置爲nil
由於編譯後的類已經註冊在 runtime 中,類結構體中的 objc_ivar_list 實例變量的鏈表 和 instance_size 實例變量的內存大小已經肯定,同時runtime 會調用 class_setIvarLayout 或 class_setWeakIvarLayout 來處理 strong weak 引用。因此不能向存在的類中添加實例變量, 運行時建立的類是能夠添加實例變量,調用 class_addIvar 函數。可是得在調用 objc_allocateClassPair 以後,objc_registerClassPair 以前,緣由同上。
1. 每個線程中都一個runloop,只有主線的的runloop默認是開啓的,其餘線程的runloop是默認沒有開啓的 2. 能夠經過CFRunLoopRun() 函數來開啓一個事件循環 3. 看SDWebImage源碼的時候見到有這麼用過.
model 主要是用來指定時間在運行循環中的優先級的
蘋果公開提供的 Mode 有兩個:
kCFRunLoopDefaultMode
kCFRunLoopCommonModes
若是咱們把一個NSTimer對象以kCFRunLoopDefaultMode添加到主運行循環中的時候,當一直有用戶事件處理的時候,NSTimer將再也不被調度
若是咱們把一個NSTimer對象以kCFRunLoopCommonModes添加到主運行循環中的時候,當一直有用戶事件處理的時候,NSTimer還能正常的調度,互不影響.
同上
1. 他是一個死循環 2.若是事件隊列中存放在事件,那就取出事件,執行相關代碼 3.若是沒有事件,就掛起,等有事件了,當即喚醒事件循環,開始執行. 簡單來講。。。 function loop() { initialize(); do { var message = get_next_message(); process_message(message); } while (message != quit); }
* MRC 手動引用計數 * ARC 自動引用計數,如今一般使用自動引用計數
經過編譯器在編譯的時候,插入如內管理的代碼
在每次事件循環開始建立自動釋放池,在每次事件結束銷燬自動釋放池 以viewDidLoad方法爲例,能夠理解爲在viewDidLoad方法開始執行以前建立自動釋放池, 在viewDidLoad方法執行以後銷燬自動釋放吃
1. 死循環了 2. 訪問一個殭屍對象
1. 我猜測autoreleasepool 本質就是一個隊列(數組), 2. 當調用autorelease的時候會把該對象添加到autoreleasepool中,而且把引用計數+1 3. 當autoreleasepool即將銷燬的時候,把其中的全部對象進行一次release操做
只要是一個對象對該block進行了強引用,在block內部有直接使用到該對象,
通常不用考慮,由於官方文檔中沒有告訴咱們要注意發生強引用,因此推測系統控件通常沒有對這些block進行強引用,因此咱們能夠不用考慮循環強引用的問題
串行隊列和並行隊列
整體上說: 使用 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.合成圖片
barrier:是障礙物的意思,在多個並行任務中間,他就像是一個隔離帶,把先後的並行任務分開. dispatch_barrier_async 做用是在並行隊列中,等待前面操做並行任務完成再執行dispatch_barrier_async中的任務,若是後面還有並行任務,會開始執行後續的並行任務
容易誤用形成死鎖
- (void)viewDidLoad
{
[super viewDidLoad]; NSLog(@"1"); dispatch_sync(dispatch_get_main_queue(), ^{ NSLog(@"2"); }); NSLog(@"3"); }
// 添加鍵值觀察 /** 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); }
1.經過setValue:forKey: 給屬性賦值 2.經過setValue:forKeyPath: 給屬性賦值 3.直接調用setter方法方法給屬性賦值 4.直接經過指針給屬性賦值 5. 給這個value設置一個值,就能夠觸發了
均可以
1. 必須用在集合對象上或普通對象的集合屬性上
2. 簡單集合運算符有@avg, @count , @max , @min ,@sum, 3. 格式 @"@sum.age"或 @"集合屬性.@max.age"
1.一個能夠是成員變量
同上
由於視圖已經對它有一個強引用了
User Defined Runtime Attributes 是一個不被看重但功能很是強大的的特性, 它可以經過KVC的方式配置一些你在interface builder 中不能配置的屬性。當你但願在IB中做盡量多得事情, 這個特性可以幫助你編寫更加輕量級的viewcontroller
1.設置全局斷點快速定位問題代碼所在行
最經常使用就是 : po 對象
其餘的參照 淺談LLDB調試器
不管是對於公司仍是開發者或設計師我的而言,面試都是一項耗時耗錢的項目,本文做者Cameron Banga從編程、設計、App Store等各個方面對iOS開發者及設計師在面試時可能會遇到的問題進行了篩選與彙總。一方面,可以幫助HR在短期內獲取更多反饋信息,更好地甄選合適人選,而iOS開發者及設計師在尋找相關工做時,也可做爲參考,爲面試作好萬全準備。
深拷貝同淺拷貝的區別:淺拷貝是指針拷貝,對一個對象進行淺拷貝,至關於對指向對象的指針進行復制,產生一個新的指向這個對象的指針,那麼就是有兩個指針指向同一個對象,這個對象銷燬後兩個指針都應該置空。深拷貝是對一個對象進行拷貝,至關於對對象進行復制,產生一個新的對象,那麼就有兩個指針分別指向兩個對象。當一個對象改變或者被銷燬後拷貝出來的新的對象不受影響。
實現深拷貝須要實現NSCoying協議,實現- (id)copyWithZone:(NSZone *)zone 方法。當對一個property屬性含有copy修飾符的時候,在進行賦值操做的時候實際上就是調用這個方法。
父類實現深拷貝以後,子類只要重寫copyWithZone方法,在方法內部調用父類的copyWithZone方法,以後實現本身的屬性的處理
父類沒有實現深拷貝,子類除了須要對本身的屬性進行處理,還要對父類的屬性進行處理。
NSNotification是通知,也是一對多的使用場景。在某些狀況下,KVO和NSNotification是同樣的,都是狀態變化以後告知對方。NSNotification的特色,就是須要被觀察者先主動發出通知,而後觀察者註冊監聽後再來進行響應,比KVO多了發送通知的一步,可是其優勢是監聽不侷限於屬性的變化,還能夠對多種多樣的狀態變化進行監聽,監聽範圍廣,使用也更靈活。
delegate 是代理,就是我不想作的事情交給別人作。好比狗須要吃飯,就經過delegate通知主人,主人就會給他作飯、盛飯、倒水,這些操做,這些狗都不須要關心,只須要調用delegate(代理人)就能夠了,由其餘類完成所須要的操做。因此delegate是一對一關係。
block是delegate的另外一種形式,是函數式編程的一種形式。使用場景跟delegate同樣,相比delegate更靈活,並且代理的實現更直觀。
KVO通常的使用場景是數據,需求是數據變化,好比股票價格變化,咱們通常使用KVO(觀察者模式)。delegate通常的使用場景是行爲,需求是須要別人幫我作一件事情,好比買賣股票,咱們通常使用delegate。
Notification通常是進行全局通知,好比利好消息一出,通知你們去買入。delegate是強關聯,就是委託和代理雙方互相知道,你委託別人買股票你就須要知道經紀人,經紀人也不要知道本身的顧客。Notification是弱關聯,利好消息發出,你不須要知道是誰發的也能夠作出相應的反應,同理發消息的人也不須要知道接收的人也能夠正常發出消息。
dispatch_async(dispatch_get_main_queue(), ^{ //須要執行的方法 });
NSOperationQueue *mainQueue = [NSOperationQueue mainQueue]; //主隊列 NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ //須要執行的方法 }]; [mainQueue addOperation:operation];
[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];
[[NSRunLoop mainRunLoop] performSelector:@selector(method) withObject:nil];
[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerMethod) userInfo:nil repeats:YES]; -(void)timerMethod { //調用類方法 [[self class] staticMethod]; } -(void)invalid { [timer invalid]; timer = nil; }
typedef struct objc_object *id
id能夠理解爲指向對象的指針。全部oc的對象 id均可以指向,編譯器不會作類型檢查,id調用任何存在的方法都不會在編譯階段報錯,固然若是這個id指向的對象沒有這個方法,該崩潰仍是會崩潰的。
NSObject *指向的必須是NSObject的子類,調用的也只能是NSObjec裏面的方法不然就要作強制類型轉換。
不是全部的OC對象都是NSObject的子類,還有一些繼承自NSProxy。NSObject *可指向的類型是id的子集。
封裝、繼承、多態
設計模式6個原則
設計一個類的功能,如何劃分粒度(單一職責)
接口隔離。
若是有一個鳥類,有飛的動做,一個鴕鳥繼承它是合適的嗎(里氏替換)
類之間的依賴如何依賴偶合度最小(依賴倒轉)
高層依賴低層,低層不能依賴高層。依賴接口,不能依賴具體的類。
若是A要調用C函數,但C是B的成員類,應該如何設計?(迪米特)
如何設計類,能作到只增長代碼,而不修改代碼,有哪些經驗(開放封閉)
經過設計模式解決。