这儿每天共享一个 iOS 的新知识,快来重视我吧

喜欢我能够帮我投个票

前言

Swift 中的内存办理基于主动引用计数 (ARC),一般来说不需求我们手动操作内存。可是,除了 ARC 之外,Swift 还支持手动内存办理,这就需求手动操作内存指针了,今日就来讲讲这块儿内容。

swift 中的指针

操作内存指针被苹果认为是不安全的,且不引荐直接操作,因此关于指针的类型基本都是以 UnSafe 开头的,比如:

  • UnsafePointer

  • UnsafeMutablePointer

  • UnsafeBufferPointer

  • UnsafeMutableBufferPointer

  • UnsafeRawPointer

  • UnsafeMutableRawPointer

  • UnsafeRawBufferPointer

  • UnsafeMutableRawBufferPointer

接下来我们具体解释一下这些指针的用法。

UnsafePointer<T>

UnsafePointer<T>是一个指向类型 T 的不可变指针。它用于拜访和操作内存中的数据,但不能修正数据本身,所以初始化的时分只能通过直接向它传递一个现已初始化的对象来进行。

读取指针指向的值只需求使用 pointee 属性

vararray:[Int]=[1,2,3,4,5]
letpointer=UnsafePointer<[Int]>(&array)
print(pointer.pointee)//打印[1,2,3,4,5]

UnsafeMutablePointer<T>

UnsafeMutablePointer<T>是一个指向类型 T 的可变指针。它用于拜访和修正内存中的数据,和 UnsafePointer 的区别是能够修正。

varvalue=10
letpointer=UnsafeMutablePointer<Int>(&value)
pointer.pointee=20
print(value)//打印20

UnsafeBufferPointer<T>

UnsafeBufferPointer<T>是一个用于拜访接连内存块中元素的不可变指针。它供给了对内存块的拜访和遍历,由于 UnsafeBufferPointer 完成了 Collection,所以能够使用 forEach 等高阶函数。

vararray:[Int]=[1,2,3,4,5]
letbufferPointer=UnsafeBufferPointer(start:array,count:array.count)
bufferPointer.forEach{valuein
print(value)
}

UnsafeMutableBufferPointer<T>

UnsafeMutableBufferPointer<T>是一个用于拜访接连内存块中元素的可变指针。它供给了对内存块的拜访和修正,与 UnsafeBufferPointer 不同的是,它能够修正。

vararray:[Int]=[1,2,3,4,5]
letbufferPointer=UnsafeMutableBufferPointer(start:&array,count:array.count)
foriinbufferPointer.startIndex..<bufferPointer.endIndex{
bufferPointer[i]+=1
}
print(array)//打印[2,3,4,5,6]

UnsafeRawPointer

UnsafeRawPointer 是一个指向原始内存的不可变指针。它能够用于拜访和操作恣意类型的内存数据。

varvalue=10
letpointer=UnsafeRawPointer(&value)
letintValue=pointer.load(as:Int.self)
print(intValue)//打印10

UnsafeMutableRawPointer

UnsafeMutableRawPointer 是一个指向原始内存的可变指针。它能够用于拜访和操作恣意类型的内存数据。申请内存的时分能够指定巨细和对齐方式:

letsize=MemoryLayout<Int>.size
letalignment=MemoryLayout<Int>.alignment
letpointer=UnsafeMutableRawPointer.allocate(byteCount:8,alignment:alignment)
pointer.storeBytes(of:32,as:Int.self)
letvalue=pointer.load(as:Int.self)
print(value)//打印32

解释下代码:

首先使用 allocate 方法创建了一个指向未初始化内存的 UnsafeMutableRawPointer 对象。byteCount 参数指定了要分配的字节数,这儿是 Int 的 8 字节,alignment 参数指定了 Int 的对齐方式。

pointer.storeBytes 这一行代码将值 32 存储到 pointer 指向的内存中。storeBytes 方法用于将值存储到指定内存地址中,as 参数指定了要存储的值的类型,这儿传 Int

pointer.load 这一行代码从 pointer 指向的内存中加载一个 Int 类型的值,并将其赋值给 value 变量。load 方法用于从指定内存地址中加载值,as 参数指定了要加载的值的类型,因此终究打印结果是 32。

UnsafeRawBufferPointer

UnsafeRawBufferPointer 是一个用于拜访接连原始内存块中数据的不可变指针。相同完成了 Collection 协议,供给了对内存块的拜访和遍历。

vararray:[Int]=[1,2,3,4,5]
letbufferPointer=UnsafeRawBufferPointer(start:&array,count:array.count*MemoryLayout<Int>.size)
bufferPointer.forEach{valuein
print(value)
}

UnsafeMutableRawBufferPointer

UnsafeMutableRawBufferPointer 是一个用于拜访接连原始内存块中数据的可变指针。它能够修正内存块。

letpointer=UnsafeMutableRawBufferPointer.allocate(byteCount:3,alignment:MemoryLayout<Int>.alignment)
pointer.copyBytes(from:[1,2,3])
pointer.forEach{
print($0)//打印1,2,3
}

这儿每天共享一个 iOS 的新知识,快来重视我吧

本文同步自微信大众号 “iOS新知”,每天准时共享一个新知识,这儿只是同步,想要及时学到就来重视我吧!