โปรโตคอล 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;
}

ตอนนี้เมื่อเราคอมไพล์และรันโปรแกรมเราจะได้ผลลัพธ์ดังต่อไปนี้

2013-09-22 21:15:50.362 Protocols[275:303] Printing Details
2013-09-22 21:15:50.364 Protocols[275:303] Printing Process Completed

ในตัวอย่างข้างต้นเราได้เห็นวิธีการเรียกและดำเนินการเมธอด delgate เริ่มต้นด้วย startAction เมื่อกระบวนการเสร็จสิ้นกระบวนการเมธอดมอบหมายเสร็จสมบูรณ์ถูกเรียกเพื่อให้การดำเนินการเสร็จสมบูรณ์

ในแอป iOS หรือ Mac ใด ๆ เราจะไม่มีการติดตั้งโปรแกรมโดยไม่มีผู้รับมอบสิทธิ์ ดังนั้นสิ่งสำคัญคือเราต้องเข้าใจการใช้งานของผู้รับมอบสิทธิ์ อ็อบเจ็กต์ผู้รับมอบสิทธิ์ควรใช้ชนิดคุณสมบัติ unsafe_unretained เพื่อหลีกเลี่ยงการรั่วไหลของหน่วยความจำ