2009-11-17 3 views
9

Sto convertendo un'app in 64-bit. I documenti Apple affermano che il tipo CGFloat è un float su 32 bit e uno double su 64 bit.Codifica/decodifica CGFloat su 32- vs 64-bit

Se è così, come gestisci la codifica/decodifica del valore? Ad esempio, se si crea uno NSNumber da un CGFloat, dovrei utilizzare il metodo -numberWithFloat: o -numberWithDouble: di NSNumber? La stessa domanda si applica ai metodi NSCoder e NSKeyedArchiver-encodeFloat:forKey: e -encodeDouble:forKey:.

Devo scrivere una macro condizionale in modo che -numberWithFloat: venga chiamato su 32-bit e -numberWithDouble: su 64-bit?

Cosa succede se un utente che esegue la versione a 64 bit dell'app salva un file in cui questi valori sono codificati come doppi e il file viene aperto/non archiviato su un sistema a 32 bit?

È improbabile che tutti i metodi della mia app che utilizzano CGFloats abbiano mai bisogno del livello di precisione di double, quindi dovrei preoccuparmi anche di questo?

risposta

12

Cosa succede se un utente che esegue la versione a 64 bit dell'app salva un file in cui questi valori sono codificati come doppi e il file viene aperto/non archiviato su un sistema a 32 bit?

Niente di speciale. Il file contiene double e presumibilmente stai inviando decodeDouble:forKey: per recuperare il valore, quindi riceverai un double. Puoi quindi trasmetterlo a CGFloat, che perderà la precisione se sei su una macchina a 32 bit, ma prima o poi devi fare quella dominante. (Anche se si tiene sul double, avrai ancora di gettare a CGFloat quando si passa il valore al quarzo/AppKit/UIKit.)

considera l'alternativa: si memorizzano float s nel file su un 64- bit, quindi caricare nuovamente il file sullo stesso computer. Tu e Quartz puoi gestire tutta la precisione del tipo a 64 bit double, ma non ce l'hai, perché lo hai buttato via quando hai scritto il file. Se il valore è cambiato nel cast, questa modifica è ora permanente.

Quindi il mio consiglio è di usare sempre il tipo double con NSKeyedArchiver, a meno che non si sa che siete mai intenzione di usare qualsiasi cosa, ma float (vale a dire, l'API di destinazione utilizza solo float, mai double). Questo non è vero per Quartz, quindi per CGFloat, utilizzare double.

+0

Mille grazie, che chiarisce molto le cose. –