Он будет печататься только так,
{ a: 'b', c: [ 'd', 'e' ], f: 'g' }
{ h: 'j', k: [ 'l', 'm' ], n: 'o' }
Я не буду предвзятым во время печати, по крайней мере. : Р
Синтаксис для создания протокола, реализующего другой протокол, таков:
@protocol NewProtocol <OldProtocol>
- (void)foo;
@end
Если вы хотите вызвать метод в NewProtocol
для указателя, напечатанного как OldProtocol
, вы можете либо вызвать responsedsToSelector
:
if ([object respondsToSelector:@selector(foo)])
[(id)object foo];
, либо определить методы-заглушки как категорию в NSObject
:
@interface NSObject (NewProtocol)
- (void)foo;
@end
@implementation NSObject (NewProtocol)
- (void)foo
{
}
@end
Помните, что протокол не добавляет код в скомпилированное приложение - он только усиливает тот факт, что ваш класс должен реализовывать методы, которые считаются «соответствующими» протоколу. Хорошее использование этого - создание группы классов с одинаковым способом работы:
или
и т. Д. Таким образом, вы можете создать
протокол, например:
@protocol plays
- (void) play;
- (NSString *) type;
@end
И затем класс, соответствующий
, ДОЛЖЕН реализовывать методы play
и типа
. Если это не так, компилятор выдает предупреждение, но в любом случае компилирует класс. В своем коде вы проверяете, соответствует ли объект протоколу со следующим кодом:
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