Я бачив, як використання протоколів 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