intPtr.destroy()
intPtr.dealloc(1)
intPtr = nil
注意:其实在这里对于Int这样的在C中映射为int的“平凡值”来说,destroy并不是必要的,因为这些值被分配在常量段上。但是对于像类的对象或者结构体实例来说,如果不保证初始化和摧毁配对的话,是会出现内存泄露的。所以没有特殊考虑的话,不论内存中到底是什么,保证initialize:和destroy配对会是一个好习惯。
指向数组的指针
在Swift中将一个数组作为参数传递到C API时,Swift已经帮助我们完成了转换,这在Apple的官方博客中有个很好的例子:
复制代码
import Accelerate
let a: [Float] = [1, 2, 3, 4]
let b: [Float] = [0.5, 0.25, 0.125, 0.0625]
var result: [Float] = [0, 0, 0, 0]
vDSP_vadd(a, 1, b, 1, &result, 1, 4)
// result now contains [1.5, 2.25, 3.125, 4.0625]
对于一般的接受const数组的C API,其要求的类型为UnsafePointer,而非const的数组则对应UnsafeMutablePointer。使用时,对于const的参数,我们直接将Swift数组传入(上例中的a和b);而对于可变的数组,在前面加上&后传入即可(上例中的result)。
对于传参,Swift进行了简化,使用起来非常方便。但是如果我们想要使用指针来像之前用memory的方式直接操作数组的话,就需要借助一个特殊的类型:UnsafeMutableBufferPointer。
Buffer Pointer是一段连续的内存的指针,通常用来表达像是数组或者字典这样的集合类型。
复制代码
var array = [1, 2, 3, 4, 5]
var arrayPtr = UnsafeMutableBufferPointer<Int>(start: &array, count: array.count)
// baseAddress 是第一个元素的指针
var basePtr = arrayPtr.baseAddress as UnsafeMutablePointer<Int>
basePtr.memory // 1
basePtr.memory = 10
basePtr.memory // 10
//下一个元素
var nextPtr = basePtr.successor()
nextPtr.memory // 2
指针操作和转换
withUnsafePointer








