Ich habe gesehen, dass die Verwendung von Objective-C-Protokollen auf folgende Weise verwendet wird:
@protocol MyProtocol <NSObject>
@required
@property (readonly) NSString *title;
@optional
- (void) someMethod;
@end
Ich habe gesehen, dass dieses Format verwendet wurde, anstatt eine konkrete Oberklasse zu schreiben, die Unterklassen erweitert. Die Frage ist, ob Sie die Eigenschaften selbst synthetisieren müssen, wenn Sie dieses Protokoll einhalten. Wenn Sie eine Oberklasse erweitern, lautet die Antwort offensichtlich nein, das müssen Sie nicht. Aber wie geht man mit Eigenschaften um, denen ein Protokoll entsprechen muss?
Nach meinem Verständnis müssen Sie die Instanzvariablen in der Header-Datei eines Objekts deklarieren, das einem Protokoll entspricht, das diese Eigenschaften erfordert. Können wir in diesem Fall annehmen, dass sie nur ein Leitprinzip sind? Offensichtlich ist dies bei einer erforderlichen Methode nicht der Fall. Der Compiler schlägt Ihnen auf das Handgelenk, um eine erforderliche Methode auszuschließen, die in einem Protokoll aufgeführt ist. Was ist die Geschichte hinter Immobilien?
Hier ist ein Beispiel, das einen Kompilierungsfehler generiert (Hinweis: Ich habe den Code gekürzt, der das vorliegende Problem nicht berücksichtigt):
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