2021-07-27

1.option 的底層實現(xiàn)

蘋果公司用option來包括一切,任何語言都會因為數(shù)據(jù)的匹配讀取為空或者不匹配而產(chǎn)生一系列的問題,很顯然,蘋果公司有想利用option來彌補這種漏洞的野心。

option真正是什么,如果他包裹了一個數(shù)據(jù),那么他如果其實真正是什么他就不會去關心,而是很完整的告訴下一個執(zhí)行,哦,我給你的是一個option的類型,具體的話,你自己想要知道,就自己去看。

網(wǎng)上已經(jīng)有很多option的講解,option其實是一個結(jié)構體,一個有nil,set組成的結(jié)構體,如果沒有值的時候,就會給nil,如果有值,就會把值附載在set上,傳給需要調(diào)用的數(shù)據(jù)。

解包 (!) 是一個很有意思的想法,如果有了option來包裹,做真正安全的數(shù)據(jù)類型,為什么還要解包,因為要用里面的值,但是注意必須要有值可用才可以

很簡單的來說,swift創(chuàng)造了一種不會出錯的安全數(shù)據(jù)類型來承接很多我們未知的數(shù)據(jù),這樣可以避免一些數(shù)據(jù)問題。也統(tǒng)一處理了數(shù)據(jù)上的差異。

  1. category 為什么不可以添加屬性

在類中使用@property,系統(tǒng)會自動生成帶“_”的成員變量和該變量的setter和getter方法。也就是說,屬性相當于一個成員變量加getter和setter方法

在分類里使用@property聲明屬性,只是將該屬性添加到該類的屬性列表,但是沒有生成相應的成員變量,也沒有實現(xiàn)setter和getter方法。

category 它是在運行期決議的。 因為在運行期即編譯完成后,對象的內(nèi)存布局已經(jīng)確定,如果添加實例變量就會破壞類的內(nèi)部布局,這對編譯型語言來說是災難性的。

Runtime技術中的關聯(lián)對象可以為類別添加屬性。

  1. timer 在滑動視圖的時候為什么會停止

RunLoop只能運行在一種mode下,如果要換mode,當前的loop也需要停下重啟成新的。

利用這個機制,ScrollView滾動過程中NSDefaultRunLoopMode(kCFRunLoopDefaultMode)的mode會切換到UITrackingRunLoopMode來保證ScrollView的流暢滑動;只有在NSDefaultRunLoopMode模式下處理的事件會影響scrllView的滑動。

如果我們把一個NSTimer對象以NSDefaultRunLoopMode(kCFRunLoopDefaultMode)添加到主運行循環(huán)中的時候, ScrollView滾動過程中會因為mode的切換,而導致NSTimer將不再被調(diào)度。

但是因為mode還是可定制的,所以:Timer計時會被scrollView的滑動影響的問題可以通過將timer添加到NSRunLoopCommonModes(kCFRunLoopCommonModes)來解決

  1. 協(xié)議

http://www.itdecent.cn/p/bc644d1fd35b

(1)協(xié)議就是用來規(guī)范雙方行為的

(2)swift語言中的協(xié)議作用是用來統(tǒng)一屬性、方法、下標的

(3)協(xié)議自身是不實現(xiàn)自身的內(nèi)容 由遵守協(xié)議的類、結(jié)構體、枚舉來實現(xiàn)

(1)、協(xié)議用來規(guī)范接口(方法)、屬性、下標

(2)、協(xié)議能夠間接實現(xiàn)多繼承

(1)使用協(xié)議指定屬性

可以定義存儲屬性、類型屬性, 必須注明屬性的權限(get set)但是協(xié)議中定義的屬性無論是存儲屬性還是計算屬性 ,協(xié)議都是不做區(qū)分的。

(2)使用協(xié)議指定行為

//[結(jié)論]一個協(xié)議可以由多個類遵守 一個類可以遵守多個協(xié)議 遵守多個協(xié)議的行為就是間接實現(xiàn)多繼承

//遵守協(xié)議的類、結(jié)構體、枚舉 必須實現(xiàn)協(xié)議中的方法

(3)協(xié)議中可以指定下標

(4)協(xié)議中指定構造方法

//[注意]當類遵守協(xié)議 實現(xiàn)協(xié)議中的構造方法 那么方法前面必須使用required修飾

(5)使用協(xié)議類型定義變量、函數(shù)的形參、函數(shù)的返回值類型

(6)規(guī)范方法/接口(協(xié)議的作用)

閉包 逃逸閉包

屬于非逃逸閉包,因為閉包就在函數(shù)體內(nèi)執(zhí)行了 在函數(shù)體結(jié)束前被調(diào)用,閉包是非逃逸型的閉包。

逃逸閉包的定義:

   當閉包作為?個實際參數(shù)傳遞給?個函數(shù)的時候,并且是在函數(shù)返回之后調(diào)?,我們就說這個閉包逃逸了。當我們聲明?個接受閉包作為形式參數(shù)的函數(shù)時,你可以在形式參數(shù)前寫 @escaping

   來明確閉包是允許逃逸的。

這種不知道什么原因雖然傳入了閉包,但并未使用,而是走了一圈又到了全局變量那,這種就是逃逸閉包,需要用escaping聲明

比如延時或者同步等等會導致 閉包的值有問題也許不能執(zhí)行,所以加了關鍵字,讓編譯器做對應的處理

閉包做為函數(shù)的參數(shù)傳遞時,在函數(shù)體結(jié)束后被調(diào)用,我們就說這個閉包逃離了這個函數(shù)體的作用域,這個閉包是逃逸型的閉包,使用@escaping來標注。

逃逸閉包也不能捕獲inout

weak 為什么會置為nil

weak assgin 的區(qū)別

推送 推送的具體實現(xiàn)

參數(shù)加密 為了防止別人抓包 使用過哪些加密;iOS 如何防止抓包

1、抓包原理

為了防止被抓包那么就要了解抓包的原理。

其實原理很是簡單:一般抓包都是通過代理服務來冒充你的服務器,客戶端真正交互的是這個假冒的代理服務,這個假冒的服務再和我們真正的服務交互,這個代理就是一個中間者 ,我們所有的數(shù)據(jù)都會通過這個中間者,所以我們的數(shù)據(jù)就會被抓取。HTTPS 也同樣會被這個中間者偽造的證書來獲取我們加密的數(shù)據(jù)。

2、防止抓包

為了數(shù)據(jù)的更安全,那么我們?nèi)绾蝸矸乐贡蛔グ?/p>

第一種思路是:如果我們能判斷是否有代理,有代理那么就存在風險。

一、發(fā)起請求之前判斷是否存在代理,存在代理就直接返回,請求失敗。

二、我們可以在請求配置中清空代理,讓請求不走代理

我們通過hook到sessionWithConfiguration: 方法。然后清空代理

第二種思路:針對HTTPS 請求。我們判斷證書的合法性。

主要是針對HTTPS 請求,對證書的一個驗證。

密碼用MD5

https://blog.csdn.net/qq_30513483/article/details/60143441

UIStackView distribute 和alignment 怎么使用

http://www.itdecent.cn/p/c889d2c075bf

https://www.oschina.net/translate/building-dynamic-layouts-for-ios-with-uistackview?print

使用Masonry 設置約束的優(yōu)先級 有什么用

http://www.itdecent.cn/p/c52275544488

//設置最小寬度

mas_greaterThanOrEqualTo

// 設置抗壓縮優(yōu)先級 優(yōu)先級高顯示完全

UILayoutPriorityDefaultHigh UILayoutConstraintAxisHorizontal

[rightLbl setContentCompressionResistancePriority:UILayoutPriorityDefaultLow forAxis:UILayoutConstraintAxisHorizontal];

怎么字典轉(zhuǎn)模型

那么Swift 也可以使用 Mirror 來獲取 Model 里面的 key - value 哦~

let mirr = Mirror(reflecting: self)

//Mirror 的 children 是一個 (label: String?, value: Any) 元組類型,表示該類的所有屬性的名字和類型

網(wǎng)絡

nsoperitaion 的使用

信號量 柵欄

下載6張圖后在同一刷新

并發(fā)3個任務 任務的執(zhí)行順序怎么樣的

weak 會置為nil的底層實現(xiàn)

swift使用oc的時候怎么使用 使用橋接

1、當我們在swift項目中新建一個oc類的時候,xcode會提示我們要不要同時創(chuàng)建橋接文件,我們點創(chuàng)建,xcode會幫我們自動創(chuàng)建一個橋接文件

文件名格式默認為:{targetName}-Bridging-Header.h。targetName為當前項目的target的名稱。

2、在橋接文件中#importOC需要暴露給Swift的內(nèi)容,這樣在swift文件中就可以訪問了。

OC想調(diào)用swift的時候怎么調(diào)用

1、在swift的代碼要能被oc調(diào)用,其定義的類要繼承自NSObject,函數(shù)要用@objc定義

或者在類的開頭用 @objcMembers 修飾,這樣類的所有屬性和方法都能被oc訪問

2、xcode已經(jīng)默認生成一個用于OC調(diào)用Swift的頭文件,文件名格式是:{targetName}-Swift.h,targetName為當前項目的target的名稱。

為啥被oc訪問的swift的類要繼承自NSObject?因為在oc中的類是依賴runtime機制的,而runtime機制需要isa指針,只有繼承NSObject才能獲得isa指針。

struct和class的區(qū)別

什么是值類型 什么是應用類型

class和struct的區(qū)別:1、class是引用類型,struct是值類型;2、class可以繼承類、接口和被繼承,struct只能繼承接口,不能被繼承;3、class有默認的無參構造函數(shù),有析構函數(shù),struct沒有默認的無參構造函數(shù),且只能聲明有參的構造函數(shù),沒有析構函數(shù);4、class可以使用abstract和sealed,有protected修飾符,struct不可以用abstract和sealed,沒有protected修飾符;5、class必須使用new初始化,結(jié)構可以不用new初始化;6、class實例由垃圾回收機制來保證內(nèi)存的回收處理,而struct變量使用完后立即自動解除內(nèi)存分配;7、從職能觀點來看,class表現(xiàn)為行為,而struct常用于存儲數(shù)據(jù);8、作為參數(shù)傳遞時,class變量以按址方式傳遞,而struct變量是以按值方式傳遞的。

swift enum和oc enum有什么區(qū)別

OC

1.oc的枚舉值相當于這個文件中的一個局部變量,只能是整型

2.不同枚舉中,枚舉名稱不可以一樣,在同一文件

swift

3.枚舉里可以寫方法

4.枚舉的rawValue可以是Float(float也是賦值的后面依次+1)或是String,或是沒有

5.可以用Rank(rawValue: 3)方法創(chuàng)建一個枚舉實例

6.枚舉實例可以帶參數(shù)

怎么根據(jù)cell的內(nèi)容自動計算cell的高度

mvc 和mvvm的區(qū)別

https://www.php.cn/faq/417740.html

他們之間的區(qū)別主要是MVC中Controller演變成了MVVM中的viewModel。MVVM主要解決了MVC中大量的DOM操作帶來的問題。MVVM中當和Model頻繁發(fā)生變化,開發(fā)者需要主動更新到View。

http://www.itdecent.cn/p/67ed133cee4f

uiview 和calayer的區(qū)別

optional swift里面為什么要引用這個類型

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容