ios - 将 Objective-C malloc 转换为 Swift

标签 ios objective-c swift

我正在开发一个用 Objective-C 编写的项目,需要更新到 Swift。我们使用 C 文件来传输数据。

这是我在 Objective-C 中给出的代码:

- (NSData *)prepareEndPacket {
    UInt8 *buff_data;
    buff_data = (uint8_t *)malloc(sizeof(uint8_t)*(PACKET_SIZE+5));
    // Call to C File
    PrepareEndPacket(buff_data);
    NSData *data_first = [NSData dataWithBytes:buff_data length:sizeof(uint8_t)*(PACKET_SIZE+5)];
    return data_first;
}

在 C.h 文件中我有这个供引用:

#define PACKET_SIZE     ((uint32_t)128)

我似乎找不到将其转换为 Swift 的好方法。任何帮助,将不胜感激。

最佳答案

mallocfree 实际上在 Swift 中工作得很好;然而,UnsafeMutablePointer API 更“原生”。我可能会使用 DatabytesNoCopy 以获得更好的性能。如果你愿意,你可以使用 Data(bytes:count:),但这会复制数据(然后你需要确保在复制后释放指针,否则你会泄漏内存,这实际上是上面 Objective-C 代码中的一个问题,因为它无法释放 缓冲区)。

所以,像这样:

func prepareEndPacket() -> Data {
    let count = PACKET_SIZE + 5
    let buf = UnsafeMutablePointer<UInt8>.allocate(capacity: count)

    PrepareEndPacket(buf)

    return Data(bytesNoCopy: buf, count: count, deallocator: .custom { ptr, _ in
        ptr.deallocate()
    })
}

通过使用 bytesNoCopy,返回的 Data 对象基本上是原始指针的包装器,当 Data 对象被销毁。

或者,您可以从头开始创建 Data 对象并获取指向其内容的指针以传递给 PrepareEndPacket():

func prepareEndPacket() -> Data {
    var data = Data(count: PACKET_SIZE + 5)

    data.withUnsafeMutableBytes { (ptr: UnsafeMutablePointer<UInt8>) in
        PrepareEndPacket(ptr)
    }

    return data
}

稍微效率较低,因为Data(count:) 初始化程序会将所有Data 的字节初始化为零(类似使用 calloc 而不是 malloc),但在许多情况下,这可能不会产生足够大的影响。

关于ios - 将 Objective-C malloc 转换为 Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53232674/

相关文章:

ios - 将方法添加到UINavigationBar后退按钮?

objective-c - Coreplot iOS 中的 LEGENDS 上的触摸事件

ios - 谷歌地图自动完成

iphone - 为什么在所有方法都是可选的情况下使用 Objective-C 协议(protocol)?

ios - Swift 核心数据关系和播种数据

ios - 添加第二个 Storyboard会导致 "could not find storyboard"错误

ios - TWTRTweetTableViewCell 无法检测链接 - Fabric TwitterKit

ios - 如何通过prepare for segue swift变量登录用户名

ios - Xcode 4.5 空符号标识

objective-c - 使用自定义 NSTableCellView 自定义 NSTableView?