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?

Foi útil?

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 floats 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top