2009-07-11 16 views
13

Il seguente codice:Che cos'è NSConcreteData e dove viene definito?

[[NSData alloc]initWithContentsOfURL:[NSURL URLWithString:mapURL]] 

restituisce un'istanza di NSConcreteData al contrario di NSData (che mi aspettavo!). Che cosa rappresentano esattamente NSConcreteData e perché viene restituito al posto di un'istanza di NSData? Inoltre, dove è definita questa classe? XCode si lamenta che non è stato definito, ma non so cosa dovrei includere per ottenere la classe.

Qualsiasi aiuto apprezzato!

risposta

19

Il framework Foundation utilizza cluster di classi in determinate aree per fornire un'interfaccia comune a varie classi. Ciò significa che, quando si utilizza un'API NSData per creare un oggetto NSData, la classe effettiva istanziata e restituita è diversa da NSData, ma può e deve essere trattata e indicata come un oggetto NSData dal codice.

Alla fine della giornata, la semplice risposta è: ignorare l'esistenza di NSConcreteData e trattarla come NSData.

Per ulteriori informazioni sui cluster di classe, consultare la sezione Class Clusters di Apple Cocoa Fundamentals Guide.

+4

ho trovato la radice del mio problema di essere un controllo sul [sub isMemberOfClass: [class] NSData] invece di [sub isKindOfClass: [class NSData]] Quest'ultima restituisce vero se sub è un'istanza di una classe derivata da NSData, mentre la prima non lo farebbe. Saluti! – Codebeef

+2

Solo una nota, non è sempre possibile trattare NSContreteData come NSData, ad esempio: quando si tenta di serializzare JSON. Genera un'eccezione: Termina l'applicazione a causa dell'eccezione non rilevata 'NSInvalidArgumentException', motivo: 'Tipo non valido in scrittura JSON (NSConcreteData)' – Tim

Problemi correlati