【问题标题】:UnsafeMutablePointer<UInt8>: What's the risk?UnsafeMutablePointer<UInt8>:有什么风险?
【发布时间】:2016-06-22 15:18:55
【问题描述】:

我在来自 Objective-C 库的回调中收到其中一个:UnsafeMutablePointer&lt;UInt8&gt;

我能够解析它。我也可以创建一个将其发送回图书馆,但是:使用“不安全”类型有什么风险?如何避免这些风险?

此外,Objective-C 库正在使用 uint8_t * 与 Swift 桥接,因为 UnsafeMutablePointer&lt;UInt8&gt;...这是 Swift 互操作的最佳选择吗?

【问题讨论】:

标签: swift unsafe-pointers


【解决方案1】:

UnsafeMutablePointer 是您在 Swift 中表示 C 指针的方式。这是不安全的,因为指针指向的底层内存可能随时更改,而 Swift 指针不知道。它也没有关于它指向的内存块大小的信息(感谢 Martin)。

如果您的库要求您使用 C 类型,在这种情况下是指向 uint8_t 的指针,那么您必须使用 UnsafeMutablePointer。否则,如果您只想表示一个数字数组,我会将所有uint8_t 类型包装在NSArray 中作为NSNumber 类型(或NSData,如果您指向字节流)以便于桥接。

您可以通过取消引用指针(如果它不是 nil)并将存储在指针处的值复制到 Swift 应用程序中的变量来避免这些风险。

【讨论】:

  • 谢谢,这是问题。
  • 这也是不安全的,因为指针没有关于它所指向的内存块的size信息,你可以很容易地通过指针访问无效的内存位置。
  • 伟大的点马丁。 @DanRosenstark 只有在指针地址处 malloc 内存而不是 deallocdestroy 时才会导致泄漏,相关讨论请参见 here(忽略自动释放指针)。
  • 好的,非常感谢您的耐心和慷慨解释这一切。尊重!
  • @DanRosenstark 可能是以上所有。
猜你喜欢
  • 1970-01-01
  • 2010-11-24
  • 2014-01-30
  • 2018-09-11
  • 1970-01-01
  • 2020-08-22
  • 2012-05-16
  • 1970-01-01
  • 2011-07-20
相关资源
最近更新 更多