1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
| /// Swift里面也有专门的指针类型,这些都被定性为 `Unsafe`(不安全的), 常见的4种类型 /// UnsafePointer<Pointee> 类似于 const Pointee * /// UnsafeMutablePointer<Pointee> 类似于 Pointee * /// UnsafeRawPointer 类似于 const void * 指向类型不确定 /// UnsafeMutableRawPointer 类似于 void * 指向类型不确定
var age = 10 func test1(_ ptr: UnsafeMutablePointer<Int>) {// int * ptr.pointee = 20 }
func test2(_ ptr: UnsafePointer<Int>) { // const int * print("test2", ptr.pointee) }
func test3(_ ptr: UnsafeRawPointer) { // const void * print("test3", ptr.load(as: Int.self)) }
func test4(_ ptr: UnsafeMutableRawPointer) { // void * ptr.storeBytes(of: 30, as: Int.self) }
//func test3(_ num: inout Int) { // //}
test1(&age) test2(&age) test3(&age) test4(&age) //test3(&age) print(age)
/// 使用场景 /// OC -> BOOL * /// Swift -> UnsafeMutablePointer<ObjeCBool> var arr = NSArray(objects: 11, 22, 33, 44) arr.enumerateObjects { (element, idx, stop) in if idx == 2 { stop.pointee = true } print(idx, element) }
/// 获得指向某个变量的指针 /// withUnsafePointer 跟body返回类型一样 var ptrAge1 = withUnsafePointer(to: &age){ $0 } print(ptrAge1.pointee) var ptrAge2 = withUnsafeMutablePointer(to: &age) { (pointer) -> UnsafeMutablePointer<Int> in return pointer } var ptrAge3 = withUnsafePointer(to: &age, { UnsafeRawPointer($0) }) var ptrAge4 = withUnsafeMutablePointer(to: &age, { UnsafeMutableRawPointer($0) }) ptrAge4.storeBytes(of: 40, as: Int.self) print(age)
/// 获取指向堆空间的指针 class Person { var age = 0 deinit { print("Person deinit") } } var person = Person() var ptrPerson1 = withUnsafePointer(to: &person, { $0 }) //保存person对象的地址值 print(ptrPerson1.pointee.age)
/// 创建指针 var mPtr = malloc(16) mPtr?.storeBytes(of: 11, as: Int.self) mPtr?.storeBytes(of: 22, toByteOffset: 8, as: Int.self) print(mPtr?.load(as: Int.self)) print(mPtr?.load(fromByteOffset: 8, as: Int.self)) free(mPtr)
var allPtr = UnsafeMutableRawPointer.allocate(byteCount: 16, alignment: 1) allPtr.storeBytes(of: 11, as: Int.self) allPtr.storeBytes(of: 22, toByteOffset: 8, as: Int.self) allPtr.advanced(by: 8) //移动8个字节,返回一个新指针 allPtr.deallocate()
var capPtr = UnsafeMutablePointer<Int>.allocate(capacity: 3) capPtr.initialize(to: 11) capPtr.successor().initialize(to: 22) capPtr.successor().successor().initialize(to: 33) print(capPtr.pointee) print((capPtr + 1).pointee) print((capPtr + 2).pointee)
print(capPtr[0]) print(capPtr[1]) print(capPtr[2]) capPtr.deinitialize(count: 3) capPtr.deallocate()
var pPtr = UnsafeMutablePointer<Person>.allocate(capacity: 3) pPtr.initialize(to: Person()) (pPtr + 1).initialize(to: Person()) (pPtr + 2).initialize(to: Person()) pPtr.deinitialize(count: 3) pPtr.deallocate()
|