- UnsafePointer
- C 指針內(nèi)存管理
- COpaquePointer 和 C convention
- GCD 和延時(shí)調(diào)?
- 獲取對(duì)象類型
- 自省
--
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è)指針使用 allocate和initialize,最后使用deinitialize和deallocate釋放指針指向的內(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")
}