Swift中的指针操作和使用详细介绍

2020-01-08 22:46:29于丽

复制代码
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