Преобразование NSValue обратно в тип структуры, который был сохранен в нем?

Я сохраняю объекты cpShape в области cpShape объектов cpShape с помощью объектов NSValue и следующих строк кода:

NSValue *shapeValue = [[NSValue alloc] initWithBytes: shape objCType: @encode(cpShape)];
[staticBodiesInUse setObject: shapeValue forKey: name];

Теперь мне нужно вернуть cpShape, чтобы сравнить его с другой фигурой. Как я могу это сделать? Я вижу метод getValue: в NSValue, но ему нужен буфер, не слишком уверен, что с ним делать.

Ответ 1

Таким образом, ответ trojanfoe является лишь отчасти правильным.

Существует огромная проблема с этим. Когда вы создаете NSValue таким образом, вы копируете структуру cpShape и получаете ее обратно, вы копируете ее снова. Структуры cpShape в значительной степени используются исключительно по ссылке. Каждый раз, когда вы его копируете, вы получаете новую ссылку на новую копию, и некоторые из этих копий существуют в стеке и автоматически уничтожаются. Очень очень плохо.

Вместо этого вы хотите создать NSValue с помощью [NSValue valueWithPointer:shape] и вернуть этот указатель с помощью [value pointerValue]. Таким образом NSValue сохраняет только указатель на исходный cpShape.

Ответ 2

Разве это не просто:

NSValue *value = [staticBodiesInUse objectForKey:name];
cpShape shape;
[value getValue:&shape];