Что такое Objective-C эквивалент Marshal.Copy - PullRequest
0 голосов
/ 12 мая 2018

Я переписываю проект с 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 голосов
/ 12 мая 2018

Если вам нужен новый буфер данных, который содержит копию переданных данных, да, вы можете делать то, что советуют люди, - создать буфер 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 является динамическим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...