文本所有代码都在playground中。
Apple抽象了Swift语言的指针,但是抽象的不够彻底。因为我一开始使用的就是C语言,对指针非常熟悉。我假设你已经熟悉指针,并想了解Swift中的指针。
下面我们来看一个整数类型的例子:
1 2 3 4 |
var my_int = 100 var ptr_myint = UnsafeMutablePointer<Int>.initialize(&my_int) ptr_myint(99) // 对指针指向的内容进行修改 my_int // my_int为99 |
给一个指针分配内存
UnsafeMutablePointer类型是可变指针:可以改变指向的对象。在上面的例子中,指针指向了一个自动释放内存的对象,我们不用管理内存。如果我们分配一块内存并赋值,我们需要释放这块内存:
1 2 3 4 5 6 7 8 9 10 11 |
// 分配1个int大小的内存。 var pointer = UnsafeMutablePointer<Int>.alloc(1) // 改变其中的值 pointer.memory = 2345 let my_int = pointer.memory // my_int = 2345 pointer.destroy() // 释放pointer指向的内存 pointer.dealloc(1) |
指向数组的指针
Swift中的指针可不可以指向数组呢?假设我们有一个int数组,我们用一个指针指向这个数组,然后用指针修改数组中的值。这里要用到了UnsafeMutableBufferPointer类型,用数组的地址和数组元素个数初始化UnsafeMutableBufferPointer,然后你可以得到baseAddress第一元素的地址,地址的类型为UnsafeMutableArray<T>,T为数组元素的类型,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
var array = [1, 2, 3, 4] var array_ptr = UnsafeMutableBufferPointer(start: &array, count: array.count) var array_base_addr = array_ptr.baseAddress as UnsafeMutablePointer<Int> array_base_addr.memory array_base_addr.memory = 10 array array_base_addr = array_base_addr.successor() array_base_addr.memory array_base_addr.memory = array_base_addr.memory + array_base_addr.predecessor().memory array |
指向自定义结构体
我们很容易创建一个指针指向系统结构,如Int。其实自定义结构体和Int一样。代码:
1 2 3 4 5 6 7 8 9 10 |
struct Address { var country: String var stree: String } var little_ming = UnsafeMutablePointer<Address>.alloc(1) little_ming.initialize(Address(country: "China", stree: "stupid stree")) little_ming.memory.country = "country" little_ming.memory.stree = "stree" |
总结:尽量避免使用指针,只有在非常需要时使用。