ObjectiveC中的Protocols

在Objective-C语言中,@protocols与@interface类似,protocol常翻译为协议(在本文中也这么翻译,其实有点儿类似于java语言的interface,但也不同,在文末有类比)

 1 @protocol Foo <Other, NSObject> //实现者必须继承Other和NSObject
2 - (void) doSomething;//实现者必须继承这个方法(方法默认情况下是@required作用范围)
3 @optional
4 - (int)getSomething;//实现者不是必须继承这个方法,因为该方法是在@optional作用范围内
5 - (void)doSomethingOptionalWithArgument:(NSString *)argument;
6 @required
7 - (NSArray *)getManySomethings:(int)howMany;//实现者必须继承这个方法(方法在@required作用范围)
8 @propery (nonatmoic, strong) NSString *fooProp;//注意:这里必须指定strong,除非这个属性是只读的
9
10 @end

NSObject协议包含了NSObject的绝大多数方法。因为实现协议的方法后的class是NSObject对象,所以protocol需要作为NSObject协议的一个子协议语法的方式继承NSObject的大部分方法。

protocls定义在头(header file——.h)文件中,可以单独一个.h文件中,或者定义在某个需要继承该协议的类的.h文件中。

例如:

UIScrollViewDelegate协议定义在UIScrollView.h文件中(可以自己在xcode中去查看或者看帮助文档)

使用protocol,在类定义时继承该协议,例如:

#import "Foo.h" //需要导入协议定义的头文件

@interface MyClass:NSObject<Foo>//MyClass继承了Foo协议
...
@end
  • 必须继承protocol中定义的非@optional方法,否则编译器会报错,编译不通过
  • 可以声明一个带有protocol的id变量,例如:id<Foo> obj = [[MyClass alloc] init];//MyClass必须是继承了Foo协议
  • 也可以声明带有协议参数的方法或者属性,例如
-(void)giveMeFooObject:(id<Foo>)anObjectImplementingFoo;
@property (nonatmoic, weak) id<Foo> myFooProperty;

与java语言中的interface类比:

相同:protocol和interface定义的方法,只是声明,没有实现;

不同:interface(java)声明的方法都是必须继承实现的,属性必须初始化;protocol声明的方法默认是必须继承实现,但也可以声明为@optional(可选)可以不继承实现,属性也只是声明而已;

原文地址:https://www.cnblogs.com/linxyz/p/2411473.html