Значение @property (только для чтения) void *data; в цели с

Я новичок в программировании под iOS, предпочитаю язык Swift и не знаю Objective C. Пока бродил по какой-то библиотеке, получил значение типа UnsafeMutableRawPointer в swift, то есть на самом деле значение String с кодировкой utf8.

Итак, я просто посмотрел на соответствующий объектный класс c, и переменная объявлена ​​​​как @property (readonly) void *data;

Итак, почему указатель недействителен и почему он преобразуется в UnsafeMutableRawPointer?

Считай меня нубом в Objective c или c.

заранее спасибо

Я не понимаю вопроса. Почему указатель на void? А почему бы не? Что еще должно быть там?

Andrey Chernukha 24.05.2019 09:42

На самом деле это вопрос новичка

noobEinstien 24.05.2019 10:55
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
80
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Все это может быть довольно много для понимания новичком. Итак, давайте начнем с синтаксиса ObjectiveC:

Свойство @property (readonly) void *data; предоставляет интерфейсы, которые говорят, что должен быть метод типа - (void *)data, что означает метод экземпляра, возвращающий указатель void. Пустой указатель является указателем на что-либо.

В этом случае ObjectiveC является чем-то вроде чистого C на уровень глубже. Я не буду проверять точное преобразование, но поскольку в C нет методов, все делается с помощью функций или даже указателей на функции. Так что где-то внизу должна быть функция (скажем, имя этого класса MyDataClass)

void *myDataClass_data(MyDataClass *self) { return self->_data; } // Or whatever the implementation is

Так что ничего интересного под капотом не происходит. Все это просто возвращает позицию в памяти без какой-либо дополнительной информации о том, что там должно быть. Вы как разработчик должны знать и интерпретировать это. Из C (или ObjectiveC) это очень просто. Несколько примеров:

char *aString = (char *)myDataClass.data; // A pure C string. Expected to be null terminated

int *arrayOfIntegers = (int *)myDataClass.data; // An array of integers
int thirdItem = arrayOfIntegers[2];

MyDataClass *nextItem = (MyDataClass *)myDataClass.data; // A pointer to another instance
for(MyDataClass *iterator = myDataClass; iterator != nil; iterator = (MyDataClass *)iterator.data) {}

Я надеюсь, вы получите картину. Дело в том, что C, а затем и ObjectiveC очень небезопасны, когда речь идет о типах данных. Вы можете преобразовать что угодно во что угодно, как хотите, и оно скомпилируется. Проблема в том, что произойдет во время выполнения.

При взгляде на Swift все становится намного безопаснее, и вы не можете просто сказать что-то вроде let integer: Int = myDataClass as Int. Вы можете принудительно применить его, и он рухнет. Или вы можете сделать дополнительный каст, и он вернет nil.

Поэтому после перехода с C/ObjectiveC вы получите небезопасный изменяемый необработанный указатель. Это означает, что у него есть позиция в памяти, о которой он понятия не имеет, что это такое и как ее использовать. Вы можете попытаться преобразовать его во что угодно, но это небезопасный, поскольку он будет игнорировать все проверки типов. Вероятно, это изменчивый, потому что содержащиеся в нем данные могут быть изменены в любой момент любой системой. Это сырой, поскольку он не содержит дополнительной информации (например, это строка). И это указатель, потому что он указывает только на позицию в памяти.

(Все фрагменты символичны, чтобы объяснить, что происходит под капотом. Пожалуйста, не воспринимайте их буквально)

Другие вопросы по теме