什么是Marshal.Copy的Objective-C等价物

时间:2018-05-11 21:33:46

标签: c# ios objective-c xamarin

我正在将一个项目从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];
       ???


}

1 个答案:

答案 0 :(得分:1)

如果您需要一个包含传递数据副本的新数据缓冲区,是的,您可以像人们建议的那样做 - 创建一个char []缓冲区并执行memcpy,但这是一个纯粹的C-way (虽然纯C没什么问题。)

Objective-C方式是使用NSData(或NSMutableData,如果您希望它可写):

NSMutableData *dataBuffer = [NSMutableData dataWithBytes:someData length:dataLength];

这将由一个用复制字节初始化的新内存块支持(如果你不想复制,那么还有另一个构造函数)。

然后使用dataBuffer.bytesdataBuffer.mutableBytes访问原始字节void *(例如,可以将其转换为char *。)

请注意new byte[]正在堆上分配(动态大小),但是您声明dataBuffer[sDataLen]的方式出现在堆栈上(并且具有固定大小)。 NSData是动态的。