ios面試筆試題及答案

才智咖 人氣:1.74W

iOS是由蘋果公司為移動裝置所開發的作業系統,支援的裝置包括iPhone、iPod touch、iPad、Apple TV,我們一起看看下面的ios面試筆試題及答案吧!

ios面試筆試題及答案

ios面試筆試題及答案

設計模式是什麼? 你知道哪些設計模式,並簡要敘述?

設計模式是一種編碼經驗,就是用比較成熟的邏輯去處理某一種型別的事情。

1). MVC模式:Model View Control,把模型 檢視 控制器 層進行解耦合編寫。

2). MVVM模式:Model View ViewModel 把模型 檢視 業務邏輯 層進行解耦和編寫。

3). 單例模式:通過static關鍵詞,宣告全域性變數。在整個程序執行期間只會被賦值一次。

4). 觀察者模式:KVO是典型的通知模式,觀察某個屬性的狀態,狀態發生變化時通知觀察者。

5). 委託模式:代理+協議的組合。實現1對1的反向傳值操作。

6). 工廠模式:通過一個類方法,批量的根據已有模板生產物件。

MVC 和 MVVM 的區別

1). MVVM是對胖模型進行的拆分,其本質是給控制器減負,將一些弱業務邏輯放到VM中去處理。

2). MVC是一切設計的基礎,所有新的設計模式都是基於MVC進行的改進。

#import跟 #include 有什麼區別,@class呢,#import<> 跟 #import””有什麼區別?

答:

1). #import是Objective-C匯入標頭檔案的關鍵字,#include是C/C++匯入標頭檔案的關鍵字,使用#import標頭檔案會自動只匯入一次,不會重複匯入。

2). @class告訴編譯器某個類的宣告,當執行時,才去檢視類的實現檔案,可以解決標頭檔案的.相互包含。

3). #import<>用來包含系統的標頭檔案,#import””用來包含使用者標頭檔案。

frame 和 bounds 有什麼不同?

frame指的是:該view在父view座標系統中的位置和大小。(參照點是父view的座標系統)

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

Objective-C的類可以多重繼承麼?可以實現多個介面麼?Category是什麼?重寫一個類的方式用繼承好還是分類好?為什麼?

答:Objective-C的類不可以多重繼承;可以實現多個介面(協議);Category是類別;一般情況用分類好,用Category去重寫類的方法,僅對本Category有效,不會影響到其他類與原有類的關係。

@property 的本質是什麼?ivar、getter、setter 是如何生成並新增到這個類中的

@property 的本質是什麼?

@property = ivar + getter + setter;

“屬性” (property)有兩大概念:ivar(例項變數)、getter+setter(存取方法)

“屬性” (property)作為 Objective-C 的一項特性,主要的作用就在於封裝物件中的資料。 Objective-C 物件通常會把其所需要的資料儲存為各種例項變數。例項變數一般通過“存取方法”(access method)來訪問。其中,“獲取方法” (getter)用於讀取變數值,而“設定方法” (setter)用於寫入變數值。

@property中有哪些屬性關鍵字?/ @property 後面可以有哪些修飾符?

屬性可以擁有的特質分為四類:

1.原子性--- nonatomic 特質

2.讀/寫許可權---readwrite(讀寫)、readonly (只讀)

3.記憶體管理語義---assign、strong、 weak、unsafe_unretained、copy

4.方法名---getter=、setter=

5.不常用的:nonnull,null_resettable,nullable

屬性關鍵字 readwrite,readonly,assign,retain,copy,nonatomic 各是什麼作用,在那種情況下用?

答:

1). readwrite 是可讀可寫特性。需要生成getter方法和setter方法。

2). readonly 是隻讀特性。只會生成getter方法,不會生成setter方法,不希望屬性在類外改變。

3). assign 是賦值特性。setter方法將傳入引數賦值給例項變數;僅設定變數時,assign用於基本資料型別。

4). retain(MRC)/strong(ARC) 表示持有特性。setter方法將傳入引數先保留,再賦值,傳入引數的retaincount會+1。

5). copy 表示拷貝特性。setter方法將傳入物件複製一份,需要完全一份新的變數時。

6). nonatomic 非原子操作。決定編譯器生成的setter和getter方法是否是原子操作,atomic表示多執行緒安全,一般使用nonatomic,效率高。

什麼情況使用 weak 關鍵字,相比 assign 有什麼不同?

1.在 ARC 中,在有可能出現迴圈引用的時候,往往要通過讓其中一端使用 weak 來解決,比如: delegate 代理屬性。

2.自身已經對它進行一次強引用,沒有必要再強引用一次,此時也會使用 weak,自定義 IBOutlet 控制元件屬性一般也使用 weak;當然,也可以使用strong。

IBOutlet連出來的檢視屬性為什麼可以被設定成weak?

因為父控制元件的subViews陣列已經對它有一個強引用。

不同點:

assign 可以用非 OC 物件,而 weak 必須用於 OC 物件。

weak 表明該屬性定義了一種“非擁有關係”。在屬性所指的物件銷燬時,屬性值會自動清空(nil)。

怎麼用 copy 關鍵字?

用途:

1. NSString、NSArray、NSDictionary 等等經常使用copy關鍵字,是因為他們有對應的可變型別:NSMutableString、NSMutableArray、NSMutableDictionary;

2. block 也經常使用 copy 關鍵字。

說明:

block 使用 copy 是從 MRC 遺留下來的“傳統”,在 MRC 中,方法內部的 block 是在棧區的,使用 copy 可以把它放到堆區.在 ARC 中寫不寫都行:對於 block 使用 copy 還是 strong 效果是一樣的,但寫上 copy 也無傷大雅,還能時刻提醒我們:編譯器自動對 block 進行了 copy 操作。如果不寫 copy ,該類的呼叫者有可能會忘記或者根本不知道“編譯器會自動對 block 進行了 copy 操作”,他們有可能會在呼叫之前自行拷貝屬性值。這種操作多餘而低效。

用@property宣告的 NSString / NSArray / NSDictionary 經常使用 copy 關鍵字,為什麼?如果改用strong關鍵字,可能造成什麼問題?

答:用 @property 宣告 NSString、NSArray、NSDictionary 經常使用 copy 關鍵字,是因為他們有對應的可變型別:NSMutableString、NSMutableArray、NSMutableDictionary,他們之間可能進行賦值操作(就是把可變的賦值給不可變的),為確保物件中的字串值不會無意間變動,應該在設定新屬性值時拷貝一份。

1. 因為父類指標可以指向子類物件,使用 copy 的目的是為了讓本物件的屬性不受外界影響,使用 copy 無論給我傳入是一個可變物件還是不可物件,我本身持有的就是一個不可變的副本。

2. 如果我們使用是 strong ,那麼這個屬性就有可能指向一個可變物件,如果這個可變物件在外部被修改了,那麼會影響該屬性。

//總結:使用copy的目的是,防止把可變型別的物件賦值給不可變型別的物件時,可變型別物件的值傳送變化會無意間篡改不可變型別物件原來的值。

淺拷貝和深拷貝的區別?

答:

淺拷貝:只複製指向物件的指標,而不復制引用物件本身。

深拷貝:複製引用物件本身。記憶體中存在了兩份獨立物件本身,當修改A時,A_copy不變。

系統物件的 copy 與 mutableCopy 方法

不管是集合類物件(NSArray、NSDictionary、NSSet ... 之類的物件),還是非集合類物件(NSString, NSNumber ... 之類的物件),接收到copy和mutableCopy訊息時,都遵循以下準則:

1. copy 返回的是不可變物件(immutableObject);如果用copy返回值呼叫mutable物件的方法就會crash。

2. mutableCopy 返回的是可變物件(mutableObject)。

一、非集合類物件的copy與mutableCopy

在非集合類物件中,對不可變物件進行copy操作,是指標複製,mutableCopy操作是內容複製;

對可變物件進行copy和mutableCopy都是內容複製。用程式碼簡單表示如下:

二、集合類物件的copy與mutableCopy (同上)

在集合類物件中,對不可變物件進行copy操作,是指標複製,mutableCopy操作是內容複製;

對可變物件進行copy和mutableCopy都是內容複製。但是:集合物件的內容複製僅限於物件本身,對集合內的物件元素仍然是指標複製。(即單層內容複製)