我正在将一个项目从Xamarin(C#)重写为Native-iOS(Objective-C)。我的问题是如何将Marshall.Copy重写为Objective-C?我们有一个具有相同功能的库吗?
Xamarin
public void notifyCallBack(IntPtr someData, uint dataLength) {
// Marshal data
byte[] dataBuffer = new byte[dataLength];
Marshal.Copy(someData, dataBuffer, 0, (int) dataLength);
}
原生iOS
void notifyCallBack(char* someData, uint dataLength) {
//Marshal data
unsigned char dataBuffer[sDataLen];
???
}
答案 0 :(得分:1)
如果您需要一个包含传递数据副本的新数据缓冲区,是的,您可以像人们建议的那样做 - 创建一个char []缓冲区并执行memcpy,但这是一个纯粹的C-way (虽然纯C没什么问题。)
Objective-C方式是使用NSData(或NSMutableData,如果您希望它可写):
NSMutableData *dataBuffer = [NSMutableData dataWithBytes:someData length:dataLength];
这将由一个用复制字节初始化的新内存块支持(如果你不想复制,那么还有另一个构造函数)。
然后使用dataBuffer.bytes
或dataBuffer.mutableBytes
访问原始字节void *
(例如,可以将其转换为char *
。)
请注意new byte[]
正在堆上分配(动态大小),但是您声明dataBuffer[sDataLen]
的方式出现在堆栈上(并且具有固定大小)。 NSData是动态的。