iOS面試題 Swift篇(一)

2021-10-11 21:30:13 字數 3910 閱讀 4545

swift是蘋果在2023年6月wwdc發布的全新程式語言,借鑑了js,python,c#,ruby等語言特性,看上去偏指令碼化,swift 仍支援 cocoa touch 框架

swift更加安全,它是型別安全的語言。

swift容易閱讀,語法和檔案結構簡易化。

swift更易於維護,檔案分離後結構更清晰。

swift**更少,簡潔的語法,可以省去大量冗餘**

swift速度更快,運算效能更高

swift 呼叫 oc**

需要建立乙個 target-bribridging-header.h 的橋檔案,在喬檔案匯入需要呼叫的oc**標頭檔案即可

oc 呼叫 swift**

直接匯入 target-swift.**件即可, swift如果需要被oc呼叫,需要使用@objc 對方法或者屬性進行修飾

在 swift 中,class 是引用型別(指標型別), struct 是值型別

值型別

值型別在傳遞和賦值時將進行複製; 賦值給var、let或者給函式傳參,是直接將所有內容拷貝乙份, 類似於對檔案進行copy、paste操作,產生了全新的檔案副本。屬於深拷貝(deep copy)

值型別: 比如結構體,列舉,是在棧空間上儲存和操作的

引用型別

引用型別只會使用引用物件的乙個"指向"; 賦值給var、let或者給函式傳參,是將記憶體位址拷貝乙份,類似於製作乙個檔案的替身(快捷方式、鏈結),指向的是同乙個檔案。屬於淺拷貝(shallow copy)

引用型別: 比如 class,是在堆空間上儲存和操作的

class 有以下功能,struct 是沒有的

class可以繼承,子類可以使用父類的特性和方法

型別轉換可以在執行時檢查和解釋乙個例項物件

class可以用 deinit來釋放資源

乙個類可以被多次引用

struct 優勢:

結構較小,適用於複製操作,相比較乙個class 例項被多次引用,struct 更安全

無需擔心記憶體洩露問題

在 swift 中,可選型是為了表達乙個變數為空的情況,當乙個變數為空,他的值就是 nil

在型別名稱後面加個問號? 來定義乙個可選型

值型別或者引用型別都可以是可選型變數

var name: string? // 預設為 nil

var age: int? // 預設為nil

print(name, age) // 列印 nil, nil

泛型主要是為增加**的靈活性而生的,它可以是對應的**滿足任意型別的的變數或方法;

泛型可以將型別引數化,提高**復用率,減少**量

// 實現乙個方法,可以交換實現任意型別

func swap(a: inout t, b: inout t)

swift 中有個5個級別的訪問控制許可權,從高到低依次是 open, public, internal, fileprivate, private

它們遵循的基本規則:

高階別的變數不允許被定義為低級別變數的成員變數,比如乙個 private 的 class 內部允許包含 public的 string值,反之低階變數可以定義在高階別變數中;

open:具備最高訪問許可權,其修飾的類可以和方法,可以在任意 模組中被訪問和重寫.

public:許可權僅次於 open,和 open 唯一的區別是: 不允許其他模組進行繼承、重寫

**internal:**預設許可權, 只允許在當前的模組中訪問,可以繼承和重寫,不允許在其他模組中訪問

fileprivate:修飾的物件只允許在當前的檔案中訪問;

private:最低級別訪問許可權,只允許在定義的作用域內訪問

swift 的記憶體管理機制同oc一致,都是arc管理機制; strong,和 weak用法同oc一樣

unowned(無主引用), 不會產生強引用,例項銷毀後仍然儲存著例項的記憶體位址(類似於oc中的unsafe_unretained), 試圖在例項銷毀後訪問無主引用,會產生執行時錯誤(野指標

值型別(比如:struct),在複製時,複製物件與原物件實際上在記憶體中指向同乙個物件,當且僅當修改複製的物件時,才會在記憶體中建立乙個新的物件

為了提公升效能,struct, string、array、dictionary、set採取了copy on write的技術

比如僅當有「寫」操作時,才會真正執行拷貝操作

對於標準庫值型別的賦值操作,swift 能確保最佳效能,所有沒必要為了保證最佳效能來避免賦值

屬性觀察是指在當前型別內對特性屬性進行監測,並作出響應,屬性觀察是 swift 中的特性,具有2種, willset 和 didset

var title: string 

didset

}

willset會傳遞新值,預設叫newvalue

didset會傳遞舊值,預設叫oldvalue

在初始化器中設定屬性值不會觸發willset和didset

值型別和引用型別相比,最大優勢可以高效的使用記憶體,值型別在棧上操作,引用型別在堆上操作,棧上操作僅僅是單個指標的移動,而堆上操作牽涉到合併,位移,重鏈結,swift 這樣設計減少了堆上記憶體分配和**次數,使用 copy-on-write將值傳遞與複製開銷降到最低

在協議和方法前面新增 @objc,然後在方法前面新增 optional關鍵字,改方式實際上是將協議轉為了oc的方式

@objc protocol someprotocol
使用擴充套件(extension),來規定可選方法,在 swift 中,協議擴充套件可以定義部分方法的預設實現

protocol someprotocol 

extension someprotocol

}

swift 的初始化方法,更加嚴格和準確, swift初始化方法需要保證所有的非optional的成員變數都完成初始化, 同時 swfit 新增了convenience和 required兩個修飾初始化器的關鍵字

相同點: 兩者都可以被用作**;

不同點: swift中的 protocol還可以對介面進行抽象,可以實現面向協議,從而大大提高程式設計效率,swift中的protocol可以用於值型別,結構體,列舉;

自省在oc中就是判斷某一物件是否屬於某乙個類的操作,有以下2種方式

[obj iskinofclass:[someclass class]]

[obj ismemberofclass:[someclass class]]

在 swift 中由於很多 class 並非繼承自 nsobject, 故而 swift 使用 is 來判斷是否屬於某一型別, is 不僅可以作用於class, 還是作用於enum和struct

函式過載是指: 函式名稱相同,函式的引數個數不同, 或者引數型別不同,或引數標籤不同, 返回值型別與函式過載無關

swift 支援函式過載

關聯值–有時會將列舉的成員值跟其他型別的變數關聯儲存在一起,會非常有用

// 關聯值

enum date

原始值–列舉成員可以使用相同型別的預設值預先關聯,這個預設值叫做:原始值

// 原始值

enum grade: string

iOS面試題 Swift篇(二)

swift 中的閉包結構是什麼樣子的 什麼是尾隨閉包 將乙個很長的閉包表示式作為函式的最後乙個實參 使用尾隨閉包可以增強函式的可讀性 尾隨閉包是乙個被書寫在函式呼叫括號外面 後面 的閉包表示式 fn 就是乙個尾隨閉包引數 func exec v1 int,v2 int,fn int,int int ...

iOS面試題 一

圖中包含的設計模式 delegate 模式 notification kvo 觀察者模式 target action 命令模式 mvc 中介者模式 內建了策略模式 裝置並不在開發者賬號裡 有 些閃退,像ios10的時候,要我們加的那個訪問許可權,如相機的訪問,就是在plist 檔案 面加上.清 快取...

iOS面試題 效能優化篇

降低包大小需要從兩方面著手 1 模擬器debug中color blended layers紅色區域表示圖層發生了混合 2 instrument 選中core animation 勾選color blended layers 避免圖層混合 uilabel圖層混合解決方法 ios8以後設定背景色為非透明...