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;
}

執行上面範例程式碼,得到以下結果 -

2018-11-16 03:10:19.639 main[18897] Printing Details
2018-11-16 03:10:19.641 main[18897] Printing Process Completed

在上面的例子中,已經看到了如何呼叫和執行委託方法。 它以startAction開始,當進程完成,就會呼叫委託方法processCompleted以使操作完成。

在任何iOS或Mac應用程式中,如果沒有代理,將永遠不會實現程式。 因此,要是了解委託的用法。 委託物件應使用unsafe_unretained屬性型別以避免記憶體洩漏。