Создание подкласса NSData
затруднительно, потому что (как заметил drewag ) он является членом кластера класса . Из Руководства по программированию двоичных данных :
... объекты данных не являются фактическими экземплярами классов NSData или NSMutableData, но вместо этого являются экземплярами одного из их частных подклассов.
Когда вы делаете [[NSData alloc] initWith...]
, вы не получаете NSData
; вы, вероятно, получите обратно NSConcreteData
. У экстраординарного Какао с любовью есть обсуждение и демонстрация кластеров подклассов классов.
Лучшим (и самым идиоматическим) вариантом, вероятно, является композиция : ваш пользовательский класс должен просто содержать NSData
ivar и реализовывать метод описания, который работает с этим вложенным объектом.
Хотя ответ drewag технически верен, это опасный метод для использования на уроках какао; он переопределит метод description
для каждого NSData
объекта в программе, независимо от того, создаете ли вы его напрямую или нет.
В конкретном случае метода description
это может быть хорошо, но для другого метода, на который более вероятно будут полагаться другие объекты в платформе, это может вызвать большие, трудно отслеживаемые проблемы. Это следует делать только в том случае, если вы уверены, что другого пути нет.
Было бы далеко лучше создать категорию и метод с префиксом:
@interface NSData (FX_Description)
- (NSString *)FX_description;
@end
Документы Apple специально упоминают эту технику переопределения категории и советуют:
Поскольку методы, объявленные в категории, добавляются в существующий класс, вы должны быть очень осторожны с именами методов.
Если имя метода, объявленного в категории, совпадает с именем метода в исходном классе или метода в другой категории в том же классе (или даже в суперклассе), поведение не определено относительно того, какая реализация метода используется во время выполнения.
Более ранняя версия документации продолжала говорить:
Само присутствие некоторых методов категории может вызвать изменения поведения во всех средах. Например, если вы переопределяете метод делегата windowWillClose:
в категории на NSObject
, всех делегатов окна в вашей программе, тогда отвечайте , используя метод категории; поведение всех ваших экземпляров NSWindow
может измениться. Категории, которые вы добавляете в каркасный класс, могут вызвать таинственные изменения в поведении и привести к сбоям. [Акцент мой.]