Я видел, как использование протоколов 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