Codificação/decodificação cgfloat em 32- vs 64 bits
-
20-09-2019 - |
Pergunta
Estou convertendo um aplicativo para trabalhar em 64 bits. Os documentos da Apple afirmam que o CGFloat
Tipo é a float
em 32 bits e um double
em 64 bits.
Se é assim, como você lida com a codificação/decodificação do valor? Por exemplo, se criando um NSNumber
a partir de um CGFloat
, devo usar o -numberWithFloat:
ou -numberWithDouble:
Método de NSNumber? A mesma pergunta se aplica ao NSCoder
e NSKeyedArchiver
métodos -encodeFloat:forKey:
e -encodeDouble:forKey:
.
Eu tenho que escrever uma macro condicional para que -numberWithFloat:
é chamado em 32 bits e -numberWithDouble:
em 64 bits?
O que acontece se um usuário executando a versão de 64 bits do aplicativo salva um arquivo em que esses valores são codificados como duplas e o arquivo é aberto/desarquivado em um sistema de 32 bits?
Todos os métodos no meu aplicativo que usam CGFloats
é improvável que precise do nível de precisão de um double
, então eu deveria me preocupar com isso?
Solução
O que acontece se um usuário executando a versão de 64 bits do aplicativo salva um arquivo em que esses valores são codificados como duplas e o arquivo é aberto/desarquivado em um sistema de 32 bits?
Nada especial. O arquivo contém um double
, e presumivelmente você está enviando decodeDouble:forKey:
Para recuperar o valor, então você receberá um double
. Você pode então lançá -lo para CGFloat
-Que perderá precisão se você estiver em uma máquina de 32 bits, mas precisará fazer isso mais cedo ou mais tarde. (Mesmo se você se segurar no double
, você ainda terá que lançar para CGFloat
Quando você passa o valor para quartz/appkit/uikit.)
Considere a alternativa: você armazena float
s No arquivo em uma máquina de 64 bits e, em seguida, carregue o arquivo na mesma máquina. Você e o quartzo podem lidar com toda a precisão dos 64 bits double
Digite, mas você não o tem, porque você jogou fora quando escreveu o arquivo. Se o valor mudou no elenco, essa mudança agora é permanente.
Portanto, minha recomendação é sempre usar o double
digite com nskeyedarchiver, a menos que você saiba que está Nunca vou usar qualquer coisa, menos float
(ou seja, a API alvo só usa float
, Nunca double
). Isso não é verdadeiro para o quartzo, então para CGFloat
, usar double
.