Widziałem, jak protokoły Objective-C są wykorzystywane w następujący sposób:
@protocol MyProtocol <NSObject>
@required
@property (readonly) NSString *title;
@optional
- (void) someMethod;
@end
Widziałem ten format używany zamiast pisania konkretnej nadklasy, która rozszerza podklasy. Pytanie brzmi, czy jeśli dostosujesz się do tego protokołu, czy musisz samodzielnie zsyntetyzować właściwości? Jeśli rozszerzasz superklasę, odpowiedź oczywiście brzmi: nie, nie musisz. Ale jak radzić sobie z właściwościami, z którymi protokół wymaga zgodności?
W moim rozumieniu nadal musisz zadeklarować zmienne instancji w pliku nagłówkowym obiektu, który jest zgodny z protokołem wymagającym tych właściwości. W takim razie czy możemy założyć, że są one tylko zasadą przewodnią? W zasadzie to samo nie dotyczy wymaganej metody. Kompilator uderzy cię w nadgarstek za wykluczenie wymaganej metody wymienionej w protokole. Jaka jest jednak historia nieruchomości?
Oto przykład, który generuje błąd kompilacji (Uwaga: przyciąłem kod, który nie odzwierciedla problemu):
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