[Swift Tips 讀書筆記]從 Objective-C 到 Swift(三)

  1. UnsafePointer
  1. C 指針內(nèi)存管理
  2. COpaquePointer 和 C convention
  3. GCD 和延時(shí)調(diào)?
  4. 獲取對(duì)象類型
  5. 自省

--

UnsafePointer - 專門針對(duì)指針的轉(zhuǎn)換

swift 思想中,所有的引用或者變量的類型都是確定并且正確對(duì)應(yīng)他們的實(shí)際類型的。不能進(jìn)行任意的類型轉(zhuǎn)換或者通過(guò)指針做出一些出格的事。

UnsafePointer 和它的一系列變體,是一套對(duì)C語(yǔ)言指針的訪問和轉(zhuǎn)換方法。對(duì)于 C語(yǔ)言中接受內(nèi)存地址作為參數(shù),Swift中會(huì)將它轉(zhuǎn)為 UnsafePointer<type>類型。

C語(yǔ)言 Swift語(yǔ)言
const Type * UnsafePointer
Type * UnsafeMutablePointer

C中,取地址中的值使用*, Swift 則可以用 memory取值

方法傳參是指針地址的時(shí)候,Swift和C都是一樣的在變量名前加上&

使用unsafeBitCast強(qiáng)制轉(zhuǎn)換

  // unsafeBitCast 會(huì)將第一個(gè)參數(shù)的內(nèi)容按照第二個(gè)參數(shù)的類型進(jìn)行轉(zhuǎn)換,而不必?fù)?dān)心是否可行。這也是 `unsafe` 所在。
 let str = unsafeBitCast(CFArrayGetValueAtIndex(arr, 0), to: CFString.self)

--

C 指針內(nèi)存管理

swift無(wú)法對(duì)C指針進(jìn)行自動(dòng)內(nèi)存管理。需要手動(dòng)進(jìn)行內(nèi)存管理,管理原則是 誰(shuí)申請(qǐng)、誰(shuí)釋放。

創(chuàng)建一個(gè)指針使用 allocateinitialize,最后使用deinitializedeallocate釋放指針指向的內(nèi)存的對(duì)象以及指針自身本身。

指針的內(nèi)存申請(qǐng)也可以用malloc或者calloc,這時(shí)候釋放使用free

--

COpaquePointer 和 C convention

C中有一種指針,在頭文件中找不到定義,實(shí)現(xiàn)細(xì)節(jié)也被隱藏起來(lái)。稱為不透明指針(Opaque Pointer)。

swift中對(duì)應(yīng)這中不透明指針的類型是COpaquePointer

C中能確定類型的指針,swfit中使用UnsafePointer對(duì)應(yīng)。

C中的函數(shù)指針,在swift中可以轉(zhuǎn)換為閉包,不過(guò)需要加上@convention標(biāo)注

--

GCD 和延時(shí)調(diào)?

可以使用GCD里的asyncAfter實(shí)現(xiàn)延時(shí)的功能。

  let interval : TimeInterval = 2.0
  DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + interval) {
        print("刷新UI")
  }

--

獲取對(duì)象類型

// 使用 type(of:)
let new = "hhhhhhh"
let type0 = type(of: new)
let p = People()
let type1 = type(of: p)
print("type0 is \(type0), type1 is \(type1)" )

--

自省

向一個(gè)對(duì)象發(fā)出詢問,以確定它是否是某個(gè)類型,叫做自省。

//OC: 
[obj1 isKindOfClass:[ClassA class]];
[obj2 isMemberOfClass:[ClassB class]];

//Swift中,NSObject的子類同樣可是使用上面兩個(gè)方法.
let u = User.sharedUser
let b0 =  u.isKind(of: User.self)  //true
let b1 = u.isMember(of: People.self) //false

//不是繼承自NSObject的類型
class People { }
let p1 : AnyObject = People()
let b2 = p1.isKind(of: People.self)  //true
let b3 = p1.isKind(of: User.self)    //false

//不是繼承自NSObject的類,還可以用 `is` 判斷類型
let p2 : AnyObject = People()
if (p2 is User) {
        print("p2 是 User")
 } else if (p2 is People) {
        print("p2 是 People")  //輸出這一行
}

//如果編譯器能夠確定實(shí)例的類型,使用`is`會(huì)有警告提示。
let p3 = People()
if (p3 is People) {  //??提示: "is" test always true
       print("p3 是 people")
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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