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