Получить указатель буфера из `NSValue`

Я хотел бы получить указатель на объект, хранящийся в NSValue так что я могу изменить это. Суть такова:

// Get a pointer to the value's buffer (it'd be void*, I guess).
CGRect *myRect = [rectValue getPointer];

// Modify the rectangle.
myRect->origin = CGPointMake(10, 10);

я заметил NSValue имеет метод pointerValue, но в документации сказано:

Значение как указатель на void. Если объект значения не был создан для хранения элемента данных размером с указатель, результат не определен.

… Так что это только кажется подходящим для значений, которые являются указателями, а это не так, это CGRect,

Между прочим, если ответ "ты не можешь сделать это", то это все еще хороший ответ, насколько я понимаю:-) Объяснение, почему не было бы интересно, так как это кажется удивительно очевидным отсутствием в API.,

1 ответ

Решение

Я верю, что ответ действительно таков: "Вы не можете этого сделать". *

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

  • NSValue Как и многие другие основные типы данных в Objective-C, является неизменным. Разрешение захватывать указатель на внутреннее значение, хранящееся в экземпляре, не очень хорошо для его неизменности.
  • Доступ к такому указателю неизбежно должен был бы вернуть void *, Это обходит все возможности компилятора для проверки типов, что для вашего же блага!
  • В целом, классы стараются скрыть как можно больше своего внутреннего состояния и функциональности от внешнего мира и тщательно управляют взаимодействием с внешним миром. Представьте себе глупый случай NSValue экземпляр хочет знать каждый раз, когда вы обращаетесь к его сохраненному значению как CGRect (насколько я знаю, NSValue на самом деле не контролирует это). С указателем он не мог знать, когда вы это сделаете. С помощью метода -[NSValue CGRectValue] Однако у вас нет выбора, кроме как сообщить об этом.

Особенно если столкнуться с этими первыми двумя причинами, вы можете даже сказать себе: ну, если все это правда, то почему pointerValue существовать? Это потенциально допускает изменчивость и потенциально позволяет указателям не проверяться типом. Хороший вопрос, но легко ответить: если вы создаете NSValue экземпляр с указателем - скажем, с +[NSValue valueWithPointer:] единственный способ вернуть указатель из экземпляра - это метод, который возвращает void *, Все остальное будет представлять собой какое-то предположение со стороны метода

* "Не могу" - это относительный термин здесь. Например, valueForKey: может по-прежнему работать, если вы знали имя внутреннего ключа.

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