Я видел, как протоколы Objective-C используются следующим образом:
@protocol MyProtocol <NSObject>
@required
@property (readonly) NSString *title;
@optional
- (void) someMethod;
@end
Я видел, как этот формат использовался вместо написания конкретного суперкласса, который расширяют подклассы. Вопрос в том, если вы соблюдаете этот протокол, нужно ли вам синтезировать свойства самостоятельно? Если вы расширяете суперкласс, ответ, очевидно, отрицательный, в этом нет необходимости. Но как поступить со свойствами, которым протокол должен соответствовать?
Насколько я понимаю, вам все равно необходимо объявить переменные экземпляра в файле заголовка объекта, который соответствует протоколу, требующему этих свойств. В таком случае можем ли мы считать, что они всего лишь руководящий принцип? В случае необходимого метода дело обстоит иначе. Компилятор хлопнет вас по запястью, чтобы исключить требуемый метод, указанный в протоколе. Но какова история свойств?
Вот пример, генерирующий ошибку компиляции (Примечание: я обрезал код, который не отражает существующую проблему):
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