Sun*_*day 12 protocols objective-c nsobject ios
我已经看到以下列方式定义的Objective-c协议:
@protocol MyProtocol <SomeOtherProtocol>
// ...
@end
Run Code Online (Sandbox Code Playgroud)
为什么协议采用其他协议? 我特别好奇为什么协议会采用该NSObject协议.
Ali*_*are 22
它与类的继承概念相同.如果协议采用另一种协议,它"继承"该采用的协议的声明方法.
该NSObject协议特别声明了诸如的方法respondsToSelector:.因此,如果您声明@protocol具有@optional方法,这将特别有用,因为当您将在符合此协议的对象上调用方法时,如果此方法是可选的,则需要在调用之前检查对象是否响应方法.
@protocol SomeProtocol <NSObject>
-(void)requiredMethod;
@optional
-(void)optionalMethod;
@end
@interface SomeObject : NSObject
-(void)testMyDelegate;
@property(nonatomic, assign) id<SomeProtocol> myDelegate;
@end
Run Code Online (Sandbox Code Playgroud)
@implementation SomeObject
@synthesize myDelegate
-(void)testMyDelegate {
// Here you can call requiredMethod without any checking because it is a required (non-optional) method
[self.myDelegate requiredMethod];
// But as "optionalMethod" is @optional, you have to check if myDelegate implements this method before calling it!
if ([myDelegate respondsToSelector:@selector(optionalMethod)]) {
// And only call it if it is implemented by the receiver
[myDelegate optionalMethod];
}
}
@end
Run Code Online (Sandbox Code Playgroud)
respondsToSelector如果myDelegate声明为实现的类型,您将只能调用myDelegaterespondsToSelector(否则您将有一些警告).这就是<SomeProtocol>协议需要自己采用协议的原因,协议本身<NSObject>就宣告了这种方法.
您可以将其id<SomeProtocol>视为"任何对象,无论其类型(id),它只需要实现声明的方法SomeProtocol,包括在父协议中声明的方法NSObject.因此它可以是任何类型的对象,但因为SomeProtocol采用NSObject协议本身,保证允许您调用respondsToSelector此对象,允许您在调用之前检查对象是否实现给定方法,如果它是可选的.
请注意,您也可能不会SomeProtocol采用NSObject协议,而是声明您的变量,id<SomeProtocol,NSObject> myDelegate以便您仍然可以调用respondsToSelector:.但是如果你这样做,你将需要在使用这个协议的任何地方以这种方式声明你所有的变量......所以SomeProtocol直接采用NSObject协议更合乎逻辑;)
| 归档时间: |
|
| 查看次数: |
1171 次 |
| 最近记录: |