我正在开发一个用 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 的好方法。任何帮助,将不胜感激。
最佳答案
malloc
和 free
实际上在 Swift 中工作得很好;然而,UnsafeMutablePointer
API 更“原生”。我可能会使用 Data
的 bytesNoCopy
以获得更好的性能。如果你愿意,你可以使用 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/