请记住,协议没有向已编译的应用程序添加任何代码-它仅强制您的类必须实现被视为“符合”协议的方法。这样做的一个好用法是生成一组具有相同操作方式的类:<printable>
或<serialized>
等,因此您可以创建一个<plays>
协议,例如:
@protocol plays
- (void) play;
- (NSString *) type;
@end
然后,符合条件的类<plays>
必须实现play
andtype
方法。如果不是,则编译器会发出警告,但仍会编译该类。在您的代码中,使用以下代码检查对象是否符合协议:
if ([obj conformsTo: @protocol(plays)]) {
[obj play];
}
类别实际上是在您的类中动态添加新方法。这些方法可以作为选择器在运行时全局访问,并且可以按名称在@selector(foo)
和中调用[object foo:bar];
类别的目的是向类添加特殊的新代码,即使您没有该类的源代码也是如此。可能存在安全问题,并且您可能在类等中创建内存泄漏。
就您而言,可能在单独的文件中 AVAudioPlayerDelegate_TrackOps.m
#import "AVAudioPlayerDelegate.h"
@implementation AVAudioPlayerDelegate (TrackOps)
- (NSObject *) foo {
return bar;
}
@end
将其作为分类的类别NSObject
会使所有类都响应foo
。Foo
也可以是独立方法 Objc_perform_selector(@selector(foo))
。
底线:使用类别将快速方法添加到类,用于实施方法实现的协议以及使用子类来使现有类专用化(诸如添加成员变量或主要的新功能之类的东西)。当不需要子类并且不需要子类时,类别也可以用于覆盖一个或两个方法,但是通常,如果要向类中添加功能,则可以创建子类。有关该主题的更多示例,想法和其他一般信息,始终有Apple对Objective-C的介绍。