2009-07-11 16 views
13

El siguiente código:¿Qué es NSConcreteData y dónde está definido?

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

devuelve una instancia de NSConcreteData en contraposición a NSData (que yo esperaba!). ¿Qué representa NSConcreteData, exactamente, y por qué se devuelve en lugar de una instancia de NSData? Además, ¿dónde está definida esta clase? XCode se queja de que no se ha definido, pero no sé qué debo incluir para poder obtener la clase.

Cualquier ayuda apreciada!

Respuesta

19

El marco de Foundation usa clusters de clase en ciertas áreas para proporcionar una interfaz común a varias clases. Lo que esto significa es que, cuando utiliza una API NSData para crear un objeto NSData, la clase real que se crea una instancia y devuelve es diferente de NSData, pero puede y debe ser tratada y referida como un objeto NSData por su código.

Al final del día, la respuesta simple es: ignorar la existencia de NSConcreteData y tratarla como NSData.

Para obtener más información sobre los clústeres de clase, consulte la sección Clústeres de clase de Cocoa Fundamentals Guide de Apple.

+4

He encontrado la raíz de mi problema a ser un cheque en [sub isMemberOfClass: [clase] NSData] en lugar de [sub isKindOfClass: [clase NSData]] éste vuelve verdad si sub es una instancia de una clase derivada de NSData, mientras que la primera no. ¡Salud! – Codebeef

+2

Sólo una nota, no siempre se puede tratar como NSContreteData NSData, ejemplo: cuando se trata de serializar JSON. Lanzará una excepción: Aplicación de finalización debido a excepción no detectada 'NSInvalidArgumentException', razón: 'Tipo inválido en escritura JSON (NSConcreteData)' – Tim