一.swift指针类型
swift认为指针是不安全的,所有指针的类的前缀为unsafe
- UnsafePointer : 指定类型的指针,指针不可变, 相当于
const Type *
- UnsafeMutablePointer : 限定类型的指针,可变指针,相当于
Type *
- UnsafeRawPointer: 不限定类型, 可以指向任何类型,但是不可变, 相当于
const void *
- UnsafeMutableRawPointer: 指向任意类型,而且可变,相当于
void *
swift | c |
---|---|
UnsafePointer | const Type * |
UnsafeMutablePointer | Type * |
UnsafeRawPointer | const void * |
UnsafeMutableRawPointer | void * |
二.swift指针内存管理
源码demo
/// let bytesPointer = UnsafeMutableRawPointer.allocate(byteCount: 4, alignment: 1)
/// bytesPointer.storeBytes(of: 0xFFFF_FFFF, as: UInt32.self)
///
/// // Load a value from the memory referenced by 'bytesPointer'
/// let x = bytesPointer.load(as: UInt8.self) // 255
///
/// // Load a value from the last two allocated bytes
/// let offsetPointer = bytesPointer + 2
/// let y = offsetPointer.load(as: UInt16.self) // 65535
自己操作指针,在allocate后要进行deallocate释放该指针
三.withUnsafeMutablePointer
的使用
var i = 11
let p0 = withUnsafeMutablePointer(to: &i, {$0})
print(p0.pointee)//11
//不简写的状态
let p1 = withUnsafeMutablePointer(to: &i) { ptr in
return ptr
}
print(p1.pointee)//11
//@inlinable public func withUnsafeMutablePointer<T, Result>(to value: inout T, _ body: (UnsafeMutablePointer<T>) throws -> Result) rethrows -> Result
//可以返回其他值,因为Result的值是由闭包的Result决定的
let p2 = withUnsafePointer(to: &i) { ptr in
ptr.pointee + 10
}
print(p2)//21 此时的p2就是一个Int值,而不是指针
四.Unmanaged
class Cls {
}
var c = Cls()
let ptr = Unmanaged.passUnretained(c as AnyObject).toOpaque()
print(ptr)//0x00006000026c40c0
- 注意:Unmanaged和withUnsafeMutablePointer获取到的地址不一样,需要研究下
- 使用
bindMemory
可以修改类型
网友评论