Кодирование / декодирование CGFloat на 32-х или 64-битных - PullRequest
9 голосов
/ 17 ноября 2009

Я конвертирую приложение для работы в 64-битной версии. В документации Apple говорится, что тип CGFloat - это float на 32-битной и double на 64-битной.

Если это так, как вы обрабатываете кодирование / декодирование значения? Например, если я создаю NSNumber из CGFloat, я должен использовать метод -numberWithFloat: или -numberWithDouble: NSNumber? Тот же вопрос относится к NSCoder и NSKeyedArchiver методам -encodeFloat:forKey: и -encodeDouble:forKey:.

Должен ли я написать условный макрос, чтобы -numberWithFloat: вызывался в 32-разрядной версии, а -numberWithDouble: - в 64-разрядной?

Что произойдет, если пользователь, работающий с 64-разрядной версией приложения, сохранит файл, в котором эти значения закодированы как двойные, а файл открыт / разархивирован в 32-разрядной системе?

Все методы в моем приложении, использующие CGFloats, вряд ли когда-либо будут нуждаться в уровне точности double, так что я должен даже беспокоиться об этом?

1 Ответ

12 голосов
/ 17 ноября 2009

Что произойдет, если пользователь, использующий 64-разрядную версию приложения, сохранит файл, в котором эти значения закодированы как двойные, а файл открыт / разархивирован в 32-разрядной системе?

Ничего особенного. Файл содержит double, и, вероятно, вы отправляете decodeDouble:forKey: для получения значения, поэтому вы получите double. Затем вы можете привести его к CGFloat - что приведет к потере точности, если вы работаете на 32-битной машине, но вам придется делать это рано или поздно. (Даже если вы удерживаете double, вам все равно придется привести к CGFloat, когда вы передадите значение в Quartz / AppKit / UIKit.)

Рассмотрим альтернативу: вы сохраняете float s в файле на 64-битном компьютере, а затем загружаете файл обратно на тот же компьютер. Вы и Quartz можете справиться с полной точностью 64-битного типа double, но у вас его нет, потому что вы выбросили его, когда записывали файл. Если значение в актерском составе вообще изменилось, это изменение теперь является постоянным.

Поэтому я рекомендую всегда использовать тип double с NSKeyedArchiver, если только вы не знаете, что никогда не будет использовать ничего, кроме float (т. Е. Целевой API использует только float , никогда double). Это не относится к кварцу, поэтому для CGFloat используйте double.

...