Objective-C protokollerinin aşağıdaki gibi kullanıldığını gördüm:
@protocol MyProtocol <NSObject>
@required
@property (readonly) NSString *title;
@optional
- (void) someMethod;
@end
Alt sınıfların genişletildiği somut bir üst sınıf yazmak yerine bu formatın kullanıldığını gördüm. Soru şu ki, bu protokole uyuyorsanız, özellikleri kendiniz sentezlemeniz gerekir mi? Bir süper sınıfı genişletiyorsanız, cevap kesinlikle hayır, buna gerek yok. Ancak bir protokolün uyması gereken özelliklerle nasıl başa çıkılır?
Anladığım kadarıyla, bu özellikleri gerektiren bir protokole uyan bir nesnenin başlık dosyasında örnek değişkenlerini bildirmeniz gerekiyor. Bu durumda, bunların sadece yol gösterici bir ilke olduğunu varsayabilir miyiz? C Hemen hemen aynı durum gerekli bir yöntem için geçerli değildir. Derleyici, bir protokolün listelediği gerekli bir yöntemi dışlamak için bileğinizi tokatlayacaktır. Mülklerin arkasındaki hikaye nedir?
İşte bir derleme hatası oluşturan bir örnek (Not: Eldeki sorunu yansıtmayan kodu kestim):
MyProtocol.h
@protocol MyProtocol <NSObject>
@required
@property (nonatomic, retain) id anObject;
@optional
TestProtocolsViewController.h
- (void)iDoCoolStuff;
@end
#import <MyProtocol.h>
@interface TestProtocolsViewController : UIViewController <MyProtocol> {
}
@end
TestProtocolsViewController.m
#import "TestProtocolsViewController.h"
@implementation TestProtocolsViewController
@synthesize anObject; // anObject doesn't exist, even though we conform to MyProtocol.
- (void)dealloc {
[anObject release]; //anObject doesn't exist, even though we conform to MyProtocol.
[super dealloc];
}
@end