Objective-C Protokolleri
Objective-C, belirli bir durum için kullanılması beklenen yöntemleri bildiren protokolleri tanımlamanıza izin verir. Protokoller, protokole uygun sınıflarda uygulanır.
Basit bir örnek, bir ağ URL işleme sınıfı olabilir, bu, ağ URL'si getirme işlemi bittikten sonra çağıran sınıfı birleştiren processCompleted delegate yöntemi gibi yöntemlere sahip bir protokole sahip olacaktır.
Aşağıda bir protokol sözdizimi gösterilmektedir.
@protocol ProtocolName
@required
// list of required methods
@optional
// list of optional methods
@end
Anahtar kelimenin altındaki yöntemler @required protokole ve aşağıdaki yöntemlere uyan sınıflarda uygulanmalıdır. @optional anahtar kelime uygulaması isteğe bağlıdır.
İşte protokole uyan sınıf için sözdizimi
@interface MyClass : NSObject <MyProtocol>
...
@end
Bu, herhangi bir MyClass örneğinin yalnızca arabirimde özel olarak bildirilen yöntemlere yanıt vereceği anlamına gelmez, aynı zamanda MyClass'ın MyProtocol'da gerekli yöntemler için uygulamalar da sağladığı anlamına gelir. Sınıf arayüzünde protokol yöntemlerini yeniden açıklamaya gerek yoktur - protokolün benimsenmesi yeterlidir.
Birden fazla protokolü benimsemek için bir sınıfa ihtiyacınız varsa, bunları virgülle ayrılmış bir liste olarak belirtebilirsiniz. Protokolü uygulayan çağıran nesnenin referansını tutan bir delege nesnemiz var.
Aşağıda bir örnek gösterilmiştir.
#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;
}
Şimdi programı derleyip çalıştırdığımızda aşağıdaki sonucu alacağız.
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
Yukarıdaki örnekte delgate yöntemlerinin nasıl çağrıldığını ve çalıştırıldığını gördük. StartAction ile başlar, işlem tamamlandıktan sonra, işlemin tamamlandığını belirtmek için processCompleted temsilci yöntemi çağrılır.
Herhangi bir iOS veya Mac uygulamasında, temsilci olmadan uygulanan bir programımız asla olmayacak. Dolayısıyla, delegelerin kullanımını anlıyoruz. Temsilci nesneleri bellek sızıntılarını önlemek için unsafe_unretained özellik türünü kullanmalıdır.