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
quelle
Hier ist ein Beispiel von mir, das perfekt funktioniert, vor allem die Protokolldefinition:
Unten finden Sie ein Arbeitsbeispiel einer Klasse, die dieses Protokoll unterstützt:
quelle
Alles, was Sie wirklich tun müssen, ist, a fallen zu lassen
in Ihrer Implementierung und Sie sollten fertig sein. Dies funktioniert genauso wie das Einfügen der Eigenschaft in Ihre Klassenschnittstelle.
Bearbeiten:
Möglicherweise möchten Sie dies genauer tun:
Dies entspricht der Art und Weise, wie die automatische Synthese von xcode Eigenschaften und Ivars erstellt, wenn Sie die automatische Synthese verwenden. Wenn Ihre Klasse also Eigenschaften aus einem Protokoll und einer Klasse hat, haben einige Ihrer Ivars nicht das andere Format, das sich auswirken könnte Lesbarkeit.
quelle
synthesize
ausreichend war. Cool!Schauen Sie sich meinen Artikel IMMOBILIEN IM PROTOKOLL an
Angenommen, ich habe MyProtocol, das eine Namenseigenschaft deklariert, und MyClass, das diesem Protokoll entspricht
Dinge, die es wert sind, erwähnt zu werden
Ich kann diese Namenseigenschaft nicht erneut deklarieren, da sie bereits vom Protokoll deklariert wurde. Wenn Sie dies tun, wird ein Fehler angezeigt
Verwendung der Eigenschaft im Protokoll
Um MyClass mit dieser Namenseigenschaft zu verwenden, müssen wir beides tun
Deklarieren Sie die Eigenschaft erneut (AppDelegate.h führt diesen Vorgang aus).
Synthetisieren Sie sich
quelle
Beispiel: 2 Klassen (Person und Seriennummer) möchten den Dienst von Viewer verwenden ... und müssen ViewerProtocol entsprechen. viewerTypeOfDescription ist eine obligatorische Eigenschaft, der Abonnentenklassen entsprechen müssen.
Ein weiteres Beispiel mit Protokollvererbung über Unterklasse
quelle
Die Variable anObject muss in Ihrer TestProtocolsViewController-Klassendefinition definiert werden. Das Protokoll informiert Sie lediglich darüber, dass sie vorhanden sein sollte.
Die Compilerfehler sagen Ihnen die Wahrheit - die Variable existiert nicht. @properties sind schließlich nur Helfer.
quelle