1.option 的底層實現(xiàn)
蘋果公司用option來包括一切耙考,任何語言都會因為數(shù)據(jù)的匹配讀取為空或者不匹配而產(chǎn)生一系列的問題倦始,很顯然鞋邑,蘋果公司有想利用option來彌補這種漏洞的野心。
option真正是什么枚碗,如果他包裹了一個數(shù)據(jù),那么他如果其實真正是什么他就不會去關心铸本,而是很完整的告訴下一個執(zhí)行,哦归敬,我給你的是一個option的類型,具體的話汪茧,你自己想要知道椅亚,就自己去看。
網(wǎng)上已經(jīng)有很多option的講解舱污,option其實是一個結(jié)構(gòu)體,一個有nil媚赖,set組成的結(jié)構(gòu)體珠插,如果沒有值的時候磨隘,就會給nil,如果有值,就會把值附載在set上设预,傳給需要調(diào)用的數(shù)據(jù)。
解包 (!) 是一個很有意思的想法犁河,如果有了option來包裹鳖枕,做真正安全的數(shù)據(jù)類型,為什么還要解包呼股,因為要用里面的值耕魄,但是注意必須要有值可用才可以
很簡單的來說,swift創(chuàng)造了一種不會出錯的安全數(shù)據(jù)類型來承接很多我們未知的數(shù)據(jù)彭谁,這樣可以避免一些數(shù)據(jù)問題吸奴。也統(tǒng)一處理了數(shù)據(jù)上的差異。
- category 為什么不可以添加屬性
在類中使用@property缠局,系統(tǒng)會自動生成帶“_”的成員變量和該變量的setter和getter方法则奥。也就是說,屬性相當于一個成員變量加getter和setter方法
在分類里使用@property聲明屬性狭园,只是將該屬性添加到該類的屬性列表读处,但是沒有生成相應的成員變量,也沒有實現(xiàn)setter和getter方法唱矛。
category 它是在運行期決議的罚舱。 因為在運行期即編譯完成后井辜,對象的內(nèi)存布局已經(jīng)確定,如果添加實例變量就會破壞類的內(nèi)部布局管闷,這對編譯型語言來說是災難性的粥脚。
Runtime技術中的關聯(lián)對象可以為類別添加屬性。
- 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)來解決
- 協(xié)議
http://www.reibang.com/p/bc644d1fd35b
(1)協(xié)議就是用來規(guī)范雙方行為的
(2)swift語言中的協(xié)議作用是用來統(tǒng)一屬性熄驼、方法土砂、下標的
(3)協(xié)議自身是不實現(xiàn)自身的內(nèi)容 由遵守協(xié)議的類、結(jié)構(gòu)體谜洽、枚舉來實現(xiàn)
(1)萝映、協(xié)議用來規(guī)范接口(方法)、屬性阐虚、下標
(2)序臂、協(xié)議能夠間接實現(xiàn)多繼承
(1)使用協(xié)議指定屬性
可以定義存儲屬性、類型屬性, 必須注明屬性的權(quán)限(get set)但是協(xié)議中定義的屬性無論是存儲屬性還是計算屬性 ,協(xié)議都是不做區(qū)分的实束。
(2)使用協(xié)議指定行為
//[結(jié)論]一個協(xié)議可以由多個類遵守 一個類可以遵守多個協(xié)議 遵守多個協(xié)議的行為就是間接實現(xiàn)多繼承
//遵守協(xié)議的類奥秆、結(jié)構(gòu)體、枚舉 必須實現(xiàn)協(xié)議中的方法
(3)協(xié)議中可以指定下標
(4)協(xié)議中指定構(gòu)造方法
//[注意]當類遵守協(xié)議 實現(xiàn)協(xié)議中的構(gòu)造方法 那么方法前面必須使用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.reibang.com/p/c889d2c075bf
https://www.oschina.net/translate/building-dynamic-layouts-for-ios-with-uistackview?print
使用Masonry 設置約束的優(yōu)先級 有什么用
http://www.reibang.com/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有默認的無參構(gòu)造函數(shù)碘裕,有析構(gòu)函數(shù)携取,struct沒有默認的無參構(gòu)造函數(shù),且只能聲明有參的構(gòu)造函數(shù)帮孔,沒有析構(gòu)函數(shù)歹茶;4、class可以使用abstract和sealed你弦,有protected修飾符惊豺,struct不可以用abstract和sealed,沒有protected修飾符禽作;5尸昧、class必須使用new初始化,結(jié)構(gòu)可以不用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.reibang.com/p/67ed133cee4f
uiview 和calayer的區(qū)別
optional swift里面為什么要引用這個類型