UnsafePointer、UnsafeMutablePointer一種是不可變的,一種是可變的。
UnsafePointer我的理解就是用來(lái)做傳參數(shù)用的,不可寫(xiě)。而我們平常用的最多的就是UnsafeMutablePointer。
指針初始化
var a = UnsafeMutablePointer<Int>.allocate(capacity: 1);// 聲明一個(gè)指針,指針類(lèi)型是Int,內(nèi)存大小就是1份Int的大小
a.pointee = 10;//指針a的值設(shè)定是10
獲取對(duì)象指針
var f : Int = 1;
var fPointer = withUnsafePointer(to: &f) {
return $0;
}
指針運(yùn)算
let aptr = UnsafeMutablePointer<Int>.allocate(capacity: 5); //申明一個(gè)5份Int大小的內(nèi)存空間
aptr.initialize(from: [33,34,35,36,37]); // 初始化
print("0_\(aptr.pointee)");
let a = aptr.advanced(by: 1); // 指針后移
print("1_\(a.pointee)");
let b = a.successor(); // 指針后移
print("2_\(b.pointee)");
let c = b + 1; // 指針后移
print("2_\(c.pointee)");
Unmanaged 對(duì)象來(lái)管理引用計(jì)數(shù)
let thisPointer = Unmanaged<UIViewController>.passUnretained(self).toOpaque();
得到self的指針地址。然后再通過(guò)
let this = Unmanaged<UIViewController>.fromOpaque(thisPointer).takeRetainedValue()
將其轉(zhuǎn)換回來(lái)。
passRetained & passUnretained 強(qiáng)弱引用
takeRetainedValue & takeRetainedValue 強(qiáng)弱引用
強(qiáng)制指針類(lèi)型轉(zhuǎn)換
pointer.withMemoryRebound(to: Int.self, capacity: 1, { (p2) -> Void in
print(p2.pointee)
})
上面代碼等同于
UnsafeRawPointer(pointer).bindMemory(to: Int.self, capacity: 1)