Swift中也有专门的指针类型,这些都被定性为“Unsafe”(不安全的),常见的有以下4种类型:
UnsafePointer 类似于 const Pointee * UnsafeMutablePointer 类似于 Pointee * UnsafeRawPointer 类似于 const void * UnsafeMutableRawPointer 类似于 void *
var age = 10
func test1 ( _ ptr: UnsafeMutablePointer < Int > ) {
ptr. pointee + = 10
}
func test2 ( _ ptr: UnsafePointer < Int > ) {
print ( ptr. pointee)
}
test1 ( & age)
test2 ( & age)
pinrt ( age)
var age = 10
func test3 ( _ ptr: UnsafeMutableRawPointer ) {
ptr. storeBytes ( of: 20 , as : Int . self )
}
func test4 ( _ ptr: UnsafeRawPointer ) {
print ( ptr. load ( as : Int . self ) )
}
test3 ( & age)
test4 ( & age)
print ( age)
指针的应用实例:
var arr = NSArray ( objects: 11 , 22 , 33 , 44 )
arr. enumerateObjects { ( obj, idx, stop) in
print ( idx, obj)
if idx == 2 {
stop. pointee = true
}
}
var arr = NSArray ( objects: 11 , 22 , 33 , 44 )
for ( idx, obj) in arr. enumerated ( ) {
print ( idx, obj)
if idx == 2 {
break
}
}
获得某个变量的指针:
var age = 11
var ptr1 = withUnsafeMutablePointer ( to: & age) { $0 }
var ptr2 = withUnsafePointer ( to: & age) { $0 }
ptr1. pointee = 22
print ( ptr2. pointee)
print ( age)
var ptr3 = withUnsafeMutablePointer ( to: & age) { UnsafeMutableRawPointer ( $0 ) }
var ptr4 = withUnsafePointer ( to: & age) { UnsafeRawPointer ( $0 ) }
ptr3. storeBytes ( of: 33 , as : Int . self )
print ( ptr4. load ( as : Int . self ) )
print ( age)
获得指向堆空间实例的指针:
class Person { }
var person = Person ( )
var ptr = withUnsafePointer ( to: & person) { UnsafeRawPointer ( $0 ) }
var heapPtr = UnsafeRawPointer ( bitPattern: ptr. load ( as : UInt . self ) )
print ( heapPtr! )
创建指针:
var ptr = UnsafeRawPointer ( bitPattern: 0x100001234 )
var ptr = malloc ( 16 )
ptr? . storeBytes ( of: 11 , as : Int . self )
ptr? . storeBytes ( of: 22 , toByteOffset: 8 , as : Int . self )
print ( ( ptr? . load ( as : Int . self ) ) ! )
print ( ( ptr? . load ( fromBytesOffset: 8 , as : Int . self ) ) ! )
free ( ptr)
var ptr = UnsafeMutableRawPointer . allocate ( byteCount: 16 , alignment: 1 )
ptr. storeBytes ( of: 11 , as : Int . self )
ptr. advanced ( by: 8 ) . storeBytes ( of: 22 , as : Int . self )
print ( ptr. load ( as : Int . self ) )
print ( ptr. advanced ( by: 8 ) . load ( as : Int . self ) )
ptr. deallocate ( )
var ptr = UnsafeMutablePointer < Int > . allocate ( capacity: 3 )
ptr. initialize ( to 11 )
ptr. successor ( ) . initialize ( to: 22 )
ptr. successor ( ) . successor ( ) . initialize ( to: 33 )
print ( ptr. pointee)
print ( ( ptr + 1 ) . pointee)
print ( ( ptr + 2 ) . pointee)
print ( ptr[ 0 ] )
print ( ptr[ 1 ] )
print ( ptr[ 2 ] )
ptr. deinitialize ( count : 3 )
ptr. deallocate ( )
指针之间的切换:
var ptr = UnsafeMutableRawPointer . allocate ( byteCount: 16 , alignment: 1 )
ptr. assumingMemoryBound ( to: Int . self ) . pointee = 11
( ptr + 8 ) . assumingMemoryBound ( to: Double . self ) . pointee = 22.0
print ( unsafeBitCast ( ptr, to: UnsafePointer < Int > . self ) . pointee)
print ( unsafeBitCase ( ptr + 8 , to: UnsafePointer < Double > . self ) . pointee)
ptr. deallocate ( )
unsafeBitCast是忽略数据类型的强制转换,不会因为数据类型的改变而改变原来的内存数据 类似于C++中的reinterpret_cast
class Person { }
var person = Person ( )
var ptr = unsafeBitCast ( person, to: UnsaeRawPointer . self )
print ( ptr)