我正在将一个项目从Xamarin(C#(重写为Native-iOS(Objective-C(。我的问题是如何将Marshall.Copy重写为Objective-C?我们是否有一个具有相同功能的库?
哈马林
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];
???
}
如果您需要一个新的数据缓冲区,其中包含传递数据的副本,是的,您可以按照人们的建议进行操作 - 制作一个 char[] 缓冲区并做一个 memcpy,但这是一个纯粹的 C 方式(尽管纯 C 没有错(。
Objective-C 的方法是使用 NSData(或者 NSMutableData,如果你希望它是可写的(:
NSMutableData *dataBuffer = [NSMutableData dataWithBytes:someData length:dataLength];
这将由使用复制的字节初始化的新内存块支持(如果您不想复制,还有另一个构造函数(。
然后使用dataBuffer.bytes
或dataBuffer.mutableBytes
以void *
形式访问原始字节(例如,可以转换为char *
(。
请注意,new byte[]
是在堆上分配的(动态大小(,但您声明的方式dataBuffer[sDataLen]
显示在堆栈上(并且具有固定大小(。NSData是动态的。