复制代码
func incrementor1(inout num: Int) {
num += 1
}
var b = 10
incrementor1(&b)
b // 11
虽然&在参数传递时表示的意义和C中一样,是某个“变量的地址”,但是在Swift中我们没有办法直接通过这个符号获取一个UnsafePointer的实例。需要注意这一点和C有所不同:
复制代码
// 无法编译
let a = 100
let b = &a
指针初始化和内存管理
在Swift中不能直接取到现有对象的地址,我们还是可以创建新的UnsafeMutablePointer对象。与Swift 中其他对象的自动内存管理不同,对于指针的管理,是需要我们手动进行内存的申请和释放的。一个 UnsafeMutablePointer的内存有三种可能状态:
1.内存没有被分配,这意味着这是一个 null 指针,或者是之前已经释放过;
2.内存进行了分配,但是值还没有被初始化;
3.内存进行了分配,并且值已经被初始化。
其中只有第三种状态下的指针是可以保证正常使用的。UnsafeMutablePointer的初始化方法(init)完成的都是从其他类型转换到UnsafeMutablePointer的工作。我们如果想要新建一个指针,需要做的是使用alloc:这个类方法。该方法接受一个num: Int作为参数,将向系统申请num个数的对应泛型类型的内存。下面的代码申请了一个Int大小的内存,并返回指向这块内存的指针:
复制代码var intPtr = UnsafeMutablePointer<Int>.alloc(1)
// "UnsafeMutablePointer(0x7FD3A8E00060)"
接下来应该做的是对这个指针的内容进行初始化,我们可以使用initialize:方法来完成初始化:
复制代码
intPtr.initialize(10)
// intPtr.memory 为 10
在完成初始化后,我们就可以通过memory来操作指针指向的内存值了。
在使用之后,我们最好尽快释放指针指向的内容和指针本身。与initialize:配对使用的destroy用来销毁指针指向的对象,而与alloc:对应的dealloc:用来释放之前申请的内存。它们都应该被配对使用:








