这儿每天共享一个 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新知”,每天准时共享一个新知识,这儿只是同步,想要及时学到就来重视我吧!