Objective-C 协议

  • 协议

    使用Objective-C,您可以定义协议,这些协议声明预期用于特定情况的方法。协议在符合协议的类中实现。一个简单的示例是网络URL处理类,它将具有一个协议,该协议带有诸如processCompleted委托方法之类的方法,一旦网络URL提取操作结束,该协议就会激发调用类。协议的语法如下所示。
    
    @protocol ProtocolName
    @required
    // list of required methods
    @optional
    // list of optional methods
    @end
    
    @required关键字下的方法必须在符合协议的类中实现,@optional关键字下的方法是可选实现的。这是符合协议的类的语法
    
    @interface MyClass : NSObject <MyProtocol>
    ...
    @end
    
    这意味着MyClass的任何实例不仅会响应接口中明确声明的方法,而且MyClass还为MyProtocol中的所需方法提供实现。无需在类接口中重新声明协议方法-协议的采用就足够了。如果您需要一个类来采用多种协议,则可以将它们指定为以逗号分隔的列表。我们有一个委托对象,其中包含实现协议的调用对象的引用。一个例子如下所示。
    
    #import <Foundation/Foundation.h>
     
    @protocol PrintProtocolDelegate
    - (void)processCompleted;
    
    @end
    
    @interface PrintClass :NSObject {
       id delegate;
    }
    
    - (void) printDetails;
    - (void) setDelegate:(id)newDelegate;
    @end
    
    @implementation PrintClass
    - (void)printDetails {
       NSLog(@"Printing Details");
       [delegate processCompleted];
    }
    
    - (void) setDelegate:(id)newDelegate {
       delegate = newDelegate;
    }
    
    @end
    
    @interface SampleClass:NSObject<PrintProtocolDelegate>
    - (void)startAction;
    
    @end
    
    @implementation SampleClass
    - (void)startAction {
       PrintClass *printClass = [[PrintClass alloc]init];
       [printClass setDelegate:self];
       [printClass printDetails];
    }
    
    -(void)processCompleted {
       NSLog(@"Printing Process Completed");
    }
    
    @end
    
    int main(int argc, const char * argv[]) {
       NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
       SampleClass *sampleClass = [[SampleClass alloc]init];
       [sampleClass startAction];
       [pool drain];
       return 0;
    }
    
    编译并执行上述代码后,将产生以下结果-
    
    2020-08-21 09:54:49.797 helloWorld[13440:3524] Printing Details
    2020-08-21 09:54:49.803 helloWorld[13440:3524] Printing Process Completed
    
    在上面的示例中,我们看到了delgate方法是如何调用和执行的。它以startAction开头,一旦过程完成,将调用委托方法processCompleted来暗示操作已完成。在任何iOS或Mac应用程序中,如果没有委托,我们将永远不会实现任何程序。因此,了解委托的用法很重要。委托对象应使用unsafe_unretained属性类型,以避免内存泄漏。