Помните, что протокол не добавляет код в скомпилированное приложение - он только усиливает тот факт, что ваш класс должен реализовывать методы, которые считаются "соответствующими" протоколу. Хорошим примером этого будет создание группы классов с одинаковым способом работы: <printable>
или <serialized>
и т. Д. Таким образом, вы можете создать протокол <plays>
, например:
@protocol plays
- (void) play;
- (NSString *) type;
@end
И затем класс, соответствующий <plays>
, ДОЛЖЕН реализовывать методы play
и type
. Если это не так, компилятор выдает предупреждение, но в любом случае компилирует класс. В своем коде вы проверяете, соответствует ли объект протоколу со следующим кодом:
if ([obj conformsTo: @protocol(plays)]) {
[obj play];
}
Категория фактически добавляет новые методы динамически в ваш класс. Эти методы доступны глобально для среды выполнения как селекторы и могут вызываться по имени, как в @selector(foo)
и [object foo:bar];
Цель категории - добавить специальный новый код в класс, даже если у вас нет исходного кода для этого класса. Могут быть проблемы с безопасностью, и вы можете создавать утечки памяти в классах и т. Д.
В вашем случае, может быть, в отдельном файле AVAudioPlayerDelegate_TrackOps.m
#import "AVAudioPlayerDelegate.h"
@implementation AVAudioPlayerDelegate (TrackOps)
- (NSObject *) foo {
// do foo stuff;
return bar;
}
@end
Если указать категорию NSObject
, все классы ответят на foo
. Foo
может быть автономным методом Objc_perform_selector(@selector(foo))
.
Итог: используйте категорию, чтобы добавить быстрый метод в класс, протоколы для обеспечения выполнения
реализации методов и подклассы для специализации существующих классов (такие как добавление переменных-членов или новые важные функции). Категории также могут использоваться для переопределения метода или двух, когда подкласс не нужен и не нужен, но обычно, если вы хотите добавить функциональность в класс, вы создаете подкласс. Для большего количества примеров, идей и другой общей информации по этой теме всегда есть введение Apple в Objective-C