iOS面試必看,我已經找到12k工作

wllim大鯊發表於2018-04-27

序言

目前形勢,參加到iOS隊伍的人是越來越多,甚至已經到供過於求了。今年,找過工作人可能會更深刻地體會到今年的就業形勢不容樂觀,加之,培訓機構一火車地向用人單位輸送iOS開發人員,打破了生態圈的動態平衡。矯情一下,言歸正傳,我奉獻一下,為iOS應聘者梳理一下面試題,希望能助一臂之力!

一、筆試:

如何理解MVC設計模式

MVC是一種架構模式,M表示MOdel,V表示檢視View,C表示控制器Controller:

  • Model負責儲存、定義、運算元據;

  • View用來展示書給使用者,和使用者進行操作互動;

  • Controller是Model和View的協調者,Controller把Model中的資料拿過來給View用。Controller可以直接與Model和View進行通訊,而View不能和Controller直接通訊。View與Controller通訊需要利用代理協議的方式,當有資料更新時,MOdel也要與Controller進行通訊,這個時候就要用Notification和KVO,這個方式就像一個廣播一樣,MOdel發訊號,Controller設定監聽接受訊號,當有資料更新時就發訊號給Controller,Model和View不能直接進行通訊,這樣會違背MVC設計模式。

如何理解MVVM設計模式

  • ViewModel層,就是View和Model層的粘合劑,他是一個放置使用者輸入驗證邏輯,檢視顯示邏輯,發起網路請求和其他各種各樣的程式碼的極好的地方。說白了,就是把原來ViewController層的業務邏輯和頁面邏輯等剝離出來放到ViewModel層。

  • View層,就是ViewController層,他的任務就是從ViewModel層獲取資料,然後顯示。

Objective-C 中是否支援垃圾回收機制?

  • OC是支援垃圾回收機制的(Garbage collection簡稱GC),但是apple的移動終端中,是不支援GC的,Mac桌面系統開發中是支援的.

  • 移動終端開發是支援ARC(Automatic Reference Counting的簡稱),ARC是在IOS5之後推出的新技術,它與GC的機制是不同的。我們在編寫程式碼時, 不需要向物件傳送release或者autorelease方法,也不可以呼叫delloc方法,編譯器會在合適的位置自動給使用者生成release訊息(autorelease),ARC 的特點是自動引用技術簡化了記憶體管理的難度.

OC的理解與特性

  • OC作為一門物件導向的語言,自然具有物件導向的語言特性:封裝、繼承、多型。它既具有靜態語言的特性(如C++),又有動態語言的效率(動態繫結、動態載入等)。總體來講,OC確實是一門不錯的程式語言,

  • Objective-C具有相當多的動態特性,表現為三方面:動態型別(Dynamic typing)、動態繫結(Dynamic binding)和動態載入(Dynamic loading)。動態——必須到執行時(run time)才會做的一些事情。

  • 動態型別:即執行時再決定物件的型別,這種動態特性在日常的應用中非常常見,簡單來說就是id型別。事實上,由於靜態型別的固定性和可預知性,從而使用的更加廣泛。靜態型別是強型別,而動態型別屬於弱型別,執行時決定接受者。

  • 動態繫結:基於動態型別,在某個例項物件被確定後,其型別便被確定了,該物件對應的屬性和響應訊息也被完全確定。

  • 動態載入:根據需求載入所需要的資源,最基本就是不同機型的適配,例如,在Retina裝置上載入@2x的圖片,而在老一些的普通蘋裝置上載入原圖,讓程式在執行時新增程式碼模組以及其他資源,使用者可根據需要載入一些可執行程式碼和資源,而不是在啟動時就載入所有元件,可執行程式碼可以含有和程式執行時整合的新類。

類別的作用

  • 給系統原有類新增方法,不能擴充套件屬性。如果類別中方法的名字跟系統的方法名一樣,在呼叫的時候類別中的方法優先順序更高;

  • 分散類的實現:如:

+(NSIndexPath *)indexPathForRow:(NSInteger)row inSection:(NSInteger)section 原本屬於NSIndexPath的方法,但因為這個方法經常使用的表的時候呼叫、跟表的關係特別密切,因此把這個方法一類別的形式、宣告在UITableView.h中。

  • 宣告私有方法,某一個方法只實現,不宣告,相當於私有方法。

  • 類別不能宣告變數,類別不可以直接新增屬性。property描述setter方法,就不會報錯。

代理的作用

  • 代理又叫委託,是一種設計模式,代理是物件與物件之間的通訊互動,代理解除了物件之間的耦合性。

  • 改變或傳遞控制鏈。允許一個類在某些特定時刻通知到其他類,而不需要獲取到那些類的指標。可以減少框架複雜度。

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

  • 代理的屬性常是assign的原因:防止迴圈引用,以至物件無法得到正確的釋放。

二、面試:

Objective-C中可修改和不可以修改型別

  • 可修改不可修改的集合類,就是可動態新增修改和不可動態新增修改。 比如NSArray和NSMutableArray,前者在初始化後的記憶體控制元件就是固定不可變的,後者可以新增等,可以動態申請新的記憶體空間

當我們呼叫一個靜態方法時,需要對物件進行 **release **嗎?

  • 不需要,靜態方法(類方法)建立一個物件時,物件已被放入自動釋放池。在自動釋放池被釋放時,很有可能被銷燬。

當我們釋放我們的物件時,為什麼需要呼叫[superdealloc]方法,它的位置又是如何的呢?

  • 因為子類的某些例項是繼承自父類的,因此需要呼叫[super dealloc]方法, 來釋放父類擁有的例項,其實也就是子類本身的。一般來說我們優先釋放子類擁 有的例項,最後釋放父類所擁有的例項。

對謂詞的認識

  • Cocoa 中提供了一個NSPredicate的類,該類主要用於指定過濾器的條件, 每一個物件通過謂詞進行篩選,判斷條件是否匹配。如果需要了解使用方法,請看謂詞的具體使用

isMemberOfClass 和 isKindOfClass 聯絡與區別

  • 聯絡:兩者都能檢測一個物件是否是某個類的成員

  • 區別:isKindOfClass 不僅用來確定一個物件是否是一個類的成員,也可以用來確定一個物件是否派生自該類的類的成員 ,而isMemberOfClass 只能做到第一點。

  • 舉例:如 ClassA派 生 自NSObject 類 , ClassA *a = [ClassA alloc] init];,[a isKindOfClass:[NSObject class]] 可以檢查出 a 是否是 NSObject派生類 的成員,但 isMemberOfClass 做不到。

解釋 “id ”型別

  • 任意型別物件,程式執行時才決定物件的型別。

**switch **語句 **if **語句區別與聯絡

  • 均表示條件的判斷,switch語句表示式只能處理的是整型、字元型和列舉型別,而選擇流程語句則沒有這樣的限制。但switch語句比選擇流程控制語句效率更高。

isMemberOfClass 和 isKindOfClass 聯絡與區別

  • 聯絡:兩者都能檢測一個物件是否是某個類的成員

  • 區別:isKindOfClass 不僅用來確定一個物件是否是一個類的成員,也可以用來確定一個物件是否派生自該類的類的成員 ,而isMemberOfClass 只能做到第一點。

  • 舉例:如 ClassA派 生 自NSObject 類 , ClassA *a = [ClassA alloc] init];,[a isKindOfClass:[NSObject class]] 可以檢查出 a 是否是 NSObject派生類 的成員,但 isMemberOfClass 做不到。

@public、@protected、@private 它們的含義與作用

  • @public:物件的例項變數的作用域在任意地方都可以被訪問 ;

  • @protected:物件的例項變數作用域在本類和子類都可以被訪問 ;

  • @private:例項變數的作用域只能在本類(自身)中訪問。

#include與#import的區別、**#import **與@class 的區別

  • #include#import其效果相同,都是查詢類中定義的行為(方法);

  • #import不會引起交叉編譯,確保標頭檔案只會被匯入一次;

  • @class 的表明,只定 義了類的名稱,而具體類的行為是未知的,一般用於.h 檔案;

* @class #import 編譯效率更高。

  • 此外@class#import 的主要區別在於解決引用死鎖的問題。

Core Data的功能

  • 對於KVC和KVO完整且自動化的支援,除了為屬性整合KVO和KVC訪問方法外,還整合了適當的集合訪問方法來處理多值關係;

  • 自動驗證屬性(property)值;

  • 支援跟蹤修改和撤銷操作;

  • 關係維護,Core Data管理資料的關係傳播,包括維護物件間的一致性;

  • 在記憶體上和介面上分組、過濾、組織資料;

  • 自動支援物件儲存在外部資料倉儲的功能;

  • 建立複雜請求:無需動手寫SQL語句,在獲取請求(fetch request)中關聯NSPredicate。NSPreadicate支援基本功能、相關子查詢和其他高階的SQL特性。它支援正確的Unicode編碼、區域感知查詢、排序和正規表示式;

  • 延遲操作:Core Data使用懶載入(lazyloading)方式減少記憶體負載,還支援部分實體化延遲載入和複製物件的資料共享機制;

  • 合併策略:Core Data內建版本跟蹤和樂觀鎖(optimistic locking)來支援多使用者寫入衝突的解決,其中,樂觀鎖就是對資料衝突進行檢測,若衝突就返回衝突的資訊;

  • 資料遷移:Core Data的Schema Migration工具可以簡化應對資料庫結構變化的任務,在某些情況允許你執行高效率的資料庫原地遷移工作;

  • 可選擇針對程式Controller層的整合,來支援UI的顯示同步Core Data在IPhone OS之上,提供NSFetchedResultsController物件來做相關工作,在Mac OS X上我們用Cocoa提供的繫結(Binding)機制來完成的。

使用block有什麼好處?使用NSTimer寫出一個使用block顯示(在UILabel上)秒錶的程式碼

  • 程式碼緊湊,傳值、回撥都很方便,省去了寫代理的很多程式碼。

  • NSTimer封裝成的block,具體實現

  • 實現方法: NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 repeats:YES callback:^() { weakSelf.secondsLabel.text = ... } [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

對學iOS還有興趣的小夥伴可以加我QQ469466106一起交流一下!~~
我也會有學習資料給你們提供,面試資料也有,希望每個學iOS的都能前程似錦,一路高歌,付出不亞於任何人的努力
複製程式碼

相關文章