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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top