2009-07-11 2 views
13

Следующий код:Что такое NSConcreteData и где оно определено?

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

возвращает экземпляр NSConcreteData в отличие от NSData (который я ожидал!). Что представляет собой NSConcreteData, и почему оно возвращается вместо экземпляра NSData? Далее, где этот класс определен? XCode жалуется, что он не был определен, но я не знаю, что я должен включить, чтобы получить класс.

Любая помощь оценена!

ответ

19

Основа Foundation использует кластеры классов в определенных областях, чтобы обеспечить общий интерфейс для различных классов. Это означает, что когда вы используете API NSData для создания объекта NSData, фактический класс, который был создан и возвращен, отличается от NSData, но может и должен быть обработан вашим объектом и указан как объект NSData.

В конце дня простой ответ: игнорировать существование NSConcreteData и обрабатывать его как NSData.

Дополнительную информацию о кластерах классов см. В разделе Кластер Класса Apple Cocoa Fundamentals Guide.

+4

Я нашел корень моей проблемы быть проверка на [суб isMemberOfClass: [NSData класс]] вместо [под isKindOfClass: [NSData класс]] Последние возвращает истину, если саб экземпляр класса, полученного из NSData, тогда как первый не будет. Приветствия! – Codebeef

+2

Просто заметьте, вы не всегда можете рассматривать NSContreteData как NSData, например: при попытке сериализации JSON. Это вызовет исключение: Завершение приложения из-за неотображенного исключения «NSInvalidArgumentException», причина: «Недопустимый тип в записи JSON (NSConcreteData)» – Tim