2016-06-22 1 views
1

Я получаю один из них в обратном вызове из библиотеки Objective-C: UnsafeMutablePointer<UInt8>UnsafeMutablePointer <UInt8>: В чем опасность?

Я могу разобрать его. Я также могу создать его, чтобы отправить его обратно в библиотеку, но: Каковы риски работы с «небезопасным» типом? Как избежать этих рисков?

Кроме того, библиотека Objective-C использует uint8_t *, которая соединяет Swift как это UnsafeMutablePointer<UInt8> ... это лучшее, что подходит для Swift interop?

+1

Можете ли вы изменить библиотеку ObjC и заставить ее предоставить NSData? – kennytm

+1

Связанные чтения: https://www.reddit.com/r/swift/comments/2q1uhr/unsafe_pointers_objective_c/ – JAL

+0

Спасибо @kennytm, это больше похоже: «Можете ли вы убедить людей C изменить их lib». Я, наверное, просто оберну его. –

ответ

5

UnsafeMutablePointer как вы представляете собой указатель C в Swift. Это небезопасно, потому что базовая память, на которую указывает указатель, может измениться в любое время без указания указателя Swift. Он также не имеет информации о размере блока памяти, на который он указывает (спасибо Мартину).

Если вашей библиотеке требуется использовать типы C, в этом случае указатель на uint8_t, то вы должны использовать UnsafeMutablePointer. В противном случае, если вы просто хотите представить массив чисел, я бы обернул все типы uint8_t в NSArray как NSNumber типов (или NSData, если вы указываете на поток байтов) для упрощения соединения.

Вы можете избежать этих рисков путем разыменования указателя (если он не равен нулю) и копирования значения, сохраненного в указателе на переменную в вашем приложении Swift.

+0

Спасибо, что ВОПРОС. –

+0

В моем невежестве я был в основном обеспокоен тем, что это как-то представит утечку. –

+3

Он также небезопасен, потому что указатель не имеет информации о * размере * блока памяти, на который он указывает, и вы можете легко получить доступ к недопустимым ячейкам памяти через указатель. –