Codifica / decodifica CGFloat su 32 vs 64 bit
-
20-09-2019 - |
Domanda
Sono la conversione di un app di lavorare in 64 bit. La documentazione di Apple affermano che il tipo CGFloat
è un float
a 32 bit e un double
a 64 bit.
Se è così, come si fa a gestire la codifica / decodifica del valore? Per esempio, se la creazione di un NSNumber
da un CGFloat
, dovrei usare il metodo -numberWithFloat:
o -numberWithDouble:
di NSNumber? La stessa domanda vale per il NSCoder
e NSKeyedArchiver
metodi -encodeFloat:forKey:
e -encodeDouble:forKey:
.
Devo scrivere una macro condizionale in modo che -numberWithFloat:
è chiamata a 32 bit e -numberWithDouble:
a 64 bit?
Che cosa succede se un utente che esegue la versione a 64 bit del app salva un file in cui questi valori sono codificati come doppie e il file viene aperto / non archiviata su un sistema a 32 bit?
Tutti i metodi nella mia app che utilizzano CGFloats
è improbabile che bisogno mai il livello di precisione di un double
, quindi dovrei nemmeno preoccuparmi di questo?
Soluzione
Che cosa succede se un utente che esegue la versione a 64 bit del app salva un file in cui questi valori sono codificati come doppie e il file viene aperto / non archiviata su un sistema a 32 bit?
Niente di speciale. Il file contiene un double
, e presumibilmente si sta inviando decodeDouble:forKey:
per recuperare il valore, in modo otterrete un double
. È quindi possibile gettarlo ai CGFloat
-, che perderà la precisione, se siete su una macchina a 32-bit, ma si deve fare quel cast, prima o poi. (Anche se si tiene sul double
, avrai ancora di gettare a CGFloat
quando si passa il valore al quarzo / AppKit / UIKit.)
Si consideri l'alternativa: si memorizzano float
s nel file su una macchina a 64 bit, e quindi caricare il file indietro sulla stessa macchina. Tu e al quarzo in grado di gestire l'intera precisione del tipo double
a 64 bit, ma non avete, perché hai buttato via quando hai scritto il file. Se il valore è cambiato affatto nel cast, che il cambiamento è ormai permanente.
Quindi il mio consiglio è di usare sempre il tipo double
con NSKeyedArchiver, se non sai che sei non intenzione di usare qualsiasi cosa, ma float
(vale a dire, l'API di destinazione utilizza solo float
, mai double
). Questo non è vero di quarzo, quindi per CGFloat
, utilizzare double
.