Swift-安全性的體現(xiàn)

主要體現(xiàn)在類型安全、運行安全、內(nèi)存安全等方面

Swift是靜態(tài)語言

靜態(tài)語言編寫的程序,在編譯完成后就已確定,不能再拓展更改,相對于動態(tài)語言來說,雖然缺失了一些靈活性,但是更加安全。
但是Swift也可以用OC的運行時特性。

Swift有完善的類型診斷(OC類型診斷較弱)

任何變量,都必須有確定的類型,且類型一旦確定,不可更改:

對于不明確指定類型的變量,變量聲明時必須進(jìn)行初始化;

 //會報錯Type annotation missing in pattern
//var a1

var a = "12"

// 會報錯Cannot assign value of type 'Int' to type 'String'
//a = 12

而OC中一個引用類型變量,可以指向任意的其他類型變量,比如一個聲明為NSString的變量,賦值一個NSNubmer的對象,編譯器不會報錯,但是實際運行過程中,由于這個變量的聲明時NSString類型,所以只能通過NSString類型提供的方法進(jìn)行訪問操作,但變量實際指向的對象是NSNumber類型,NSString類型的方法是找不到的,所以會發(fā)生異常,
尤其是網(wǎng)絡(luò)數(shù)據(jù)解析的時候,經(jīng)??赡芘龅?,解析出一個NSNull對象,被賦值給一個NSString變量

2、可選性的定義,使得開發(fā)者必須去考慮空的情況

在OC中,任何變量的聲明,可以不賦初值,對應(yīng)基礎(chǔ)數(shù)據(jù)類型,如int,會有默認(rèn)值0,對于引用類型變量,則默認(rèn)值為nil
引用類型中,對nil進(jìn)行任何方法訪問,都是不會報錯的
但是在Swift中,如果一個變量,不是可選性,那么一定是有值的,而且類型確定,通過它的類型去訪問不會有問題。
但是如果一個變量,是可選性,那么它可能是nil,可能是沒有值
對于可選性變量的訪問,Swift提供了多種解包方式,必須用這些解包方式直接或者間接的解包后,去訪問它的屬性或方法,
這提供了一種機(jī)制,如果是nil,則不會繼續(xù)訪問,不是nil,才會訪問

附常用解包方式
(1)! 強(qiáng)制解包,如果為空,則會崩潰
(2)? 解包
(3)?? 解包,通常用來提供默認(rèn)值
(4)if let解包
(5)guard let解包
(6)自動解包:變量聲明時,如 var test: String!,這樣在使用的時候,就會自動解包(與?修飾的區(qū)別是,?修飾的還需要手動解包),但是需要注意的是,我們需確保這個變量,在使用的時候,不是為nil的

Swift中有明確的初始化機(jī)制(非可選型變量)

前面說到,一個不明確類型的變量,必須聲明時初始化
但是對于一個顯示聲明類型的變量,要看它所在位置;
1、全局變量、局部變量(函數(shù)中)
必須聲明的同時,進(jìn)行初始化
2、成員變量(struct或class的屬性)
(1)可以在聲明的同時,進(jìn)行初始化賦初值
(2)如果聲明時不賦初值,那么要在構(gòu)造器中進(jìn)行初始化賦初值

Swift注重值類型,降低了內(nèi)存泄漏的風(fēng)險

在Swift中,常用的內(nèi)建數(shù)據(jù)類型,如Array、Dictionary、Set等,都設(shè)計為值類型,由此可見Swift對值類型的注重,并且還提供了值類型寫時復(fù)制機(jī)制,優(yōu)化了值類型的內(nèi)存管理。
值類型存儲在棧中,沒有引用計數(shù),由系統(tǒng)管理內(nèi)存,很大程度是降低了開發(fā)者編碼內(nèi)存泄漏的風(fēng)險。
引用類型存儲在堆中,雖然有ARC機(jī)制,但是開發(fā)者對依舊其內(nèi)存管理的干預(yù)較大,一定程度上增加了內(nèi)存泄漏的風(fēng)險。

Swift閉包類型的明確劃分,也一定程度上降低了內(nèi)存泄漏的風(fēng)險

Swift中對閉包有較為明確的區(qū)分,有專屬的關(guān)鍵字。
非逃逸閉包,是生命周期同方法的作用域一致的閉包,當(dāng)方法調(diào)用結(jié)束,閉包就被釋放,同時閉包所捕獲的實例或引用也會被釋放。
逃逸閉包,也就是閉包的生命周期逃逸出方法的作用域,這個時候就要注意其捕獲的實例是否會導(dǎo)致內(nèi)存泄漏問題。Swift通過這兩個關(guān)鍵字提醒開發(fā)者注意內(nèi)存泄漏問題。

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

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

  • Swift 使用自動引用計數(shù)(ARC)機(jī)制來跟蹤和管理你的應(yīng)用程序的內(nèi)存。 通常情況下,Swift 內(nèi)存管理機(jī)制會...
    DevXue閱讀 176評論 0 0
  • 過定義構(gòu)造器來實現(xiàn)構(gòu)造過程,它就像用來創(chuàng)建特定類型新實例的特殊方法。 Swift 的構(gòu)造器沒有返回值。它們的主要任...
    DevXue閱讀 161評論 0 0
  • 基礎(chǔ)篇 1. class 、struct、enmu 的區(qū)別? 相同點: 都可以定義屬性和方法;下標(biāo)語法訪問值;初始...
    zbzbwxe閱讀 7,719評論 0 8
  • Swift關(guān)鍵字匯總?cè)缦拢?一: 常見使用頻繁的關(guān)鍵字: 1,訪問修飾符:在swift中,訪問修飾符有五種,分別是...
    物非0人非閱讀 3,706評論 2 15
  • import (導(dǎo)入聲明) 導(dǎo)入聲明(import declaration) 讓你可以使用在其他文件中聲明的內(nèi)容。...
    xiaofu666閱讀 1,584評論 0 2

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