Как расшириться, протоколы / делегирует в Objective C

Он будет печататься только так,

{ a: 'b', c: [ 'd', 'e' ], f: 'g' }
{ h: 'j', k: [ 'l', 'm' ], n: 'o' }

Я не буду предвзятым во время печати, по крайней мере. : Р

72
задан dizy 9 April 2009 в 05:30
поделиться

2 ответа

Синтаксис для создания протокола, реализующего другой протокол, таков:

@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
130
ответ дан rpetrich 24 November 2019 в 12:39
поделиться

Помните, что протокол не добавляет код в скомпилированное приложение - он только усиливает тот факт, что ваш класс должен реализовывать методы, которые считаются «соответствующими» протоколу. Хорошее использование этого - создание группы классов с одинаковым способом работы: или и т. Д. Таким образом, вы можете создать протокол, например:

@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

11
ответ дан 24 November 2019 в 12:39
поделиться