UnsafeMutablePointer<UInt8>:有什么风险?
UnsafeMutablePointer<UInt8>: What's the risk?
我正在从 Objective-C 库的回调中收到其中一个:UnsafeMutablePointer<UInt8>
我可以解析它。我也可以创建一个将其送回图书馆,但是:使用 "unsafe" 类型有什么风险?我该如何规避这些风险?
此外,Objective-C 库正在使用 uint8_t *
连接到 Swift,因为 UnsafeMutablePointer<UInt8>
...这是 Swift 的最佳选择互操作?
UnsafeMutablePointer
是您在 Swift 中表示 C 指针的方式。这是不安全的,因为指针指向的底层内存可能会在 Swift 指针不知道的情况下随时更改。它也没有关于它指向的内存块大小的信息(感谢 Martin)。
如果您的库要求您使用 C 类型,在本例中是指向 uint8_t
的指针,那么您必须使用 UnsafeMutablePointer
。否则,如果你只想表示一个数字数组,我会将所有 uint8_t
类型包装在 NSArray
中作为 NSNumber
类型(或者 NSData
如果你指向字节流)以便于桥接。
您可以通过取消引用指针(如果它不是 nil)并将指针处存储的值复制到 Swift 应用程序中的变量来避免这些风险。
我正在从 Objective-C 库的回调中收到其中一个:UnsafeMutablePointer<UInt8>
我可以解析它。我也可以创建一个将其送回图书馆,但是:使用 "unsafe" 类型有什么风险?我该如何规避这些风险?
此外,Objective-C 库正在使用 uint8_t *
连接到 Swift,因为 UnsafeMutablePointer<UInt8>
...这是 Swift 的最佳选择互操作?
UnsafeMutablePointer
是您在 Swift 中表示 C 指针的方式。这是不安全的,因为指针指向的底层内存可能会在 Swift 指针不知道的情况下随时更改。它也没有关于它指向的内存块大小的信息(感谢 Martin)。
如果您的库要求您使用 C 类型,在本例中是指向 uint8_t
的指针,那么您必须使用 UnsafeMutablePointer
。否则,如果你只想表示一个数字数组,我会将所有 uint8_t
类型包装在 NSArray
中作为 NSNumber
类型(或者 NSData
如果你指向字节流)以便于桥接。
您可以通过取消引用指针(如果它不是 nil)并将指针处存储的值复制到 Swift 应用程序中的变量来避免这些风险。