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