2010-07-31 13 views
17

Ich möchte ein Protokoll mit wenigen Eigenschaften definieren und diese Eigenschaften in einer anderen NSObject-Unterklasse verwenden müssen. Bitte geben Sie mir Link oder Beispielcode. Ich brauche das, um mit 10.5 zu arbeiten.So definieren und implementieren Sie Eigenschaften im Protokoll

Dank BITTE den folgenden Beispielcode

@protocol MyProtocol 
@property (nonatomic, readonly) id someObject; 
@property (nonatomic, getter=isAlive) BOOL alive; 
@end 

#import "MyProtocol.h" 
@interface MyCustomClass : NSObject <MyProtocol>{ 

} 
@end 

#import "MyCustomClass.h" 
@implementation MyCustomClass 
@synthesize someObject,alive; 

/* 
- (id)someObject { 
    return nil; 
} 

- (BOOL)isAlive { 
    return YES; 
} 

- (void)setAlive:(BOOL)aBOOL { 
} 
*/ 
@end 

** Hinzugefügt CHECK: compling Code mit x86_64-Architektur funktioniert gut. Aber Fehler, wenn ich werde die Architektur i386 ändern, dann ich erhalte folgende Warnungen:.

MyCustomClass.m:13: error: synthesized property 'someObject' must either be named the same as a compatible ivar or must explicitly name an ivar 

error: synthesized property 'alive' must either be named the same as a compatible ivar or must explicitly name an ivar 

Ich möchte nur wissen, warum es in x86_64 mit @synthesize arbeitet und nicht in i386 **

Antwort

33

@property sagt nur dem Compiler, dass die Klasse die Methoden definiert, die dieser Eigenschaft entsprechen.

@protocol MyProtocol 
@property (nonatomic, readonly) id someObject; 
@property (nonatomic, getter=isAlive) BOOL alive; 
@end 

Alles, das Protokoll implementiert müssen jetzt

- (id)someObject; 
- (BOOL)isAlive; 
- (void)setAlive:(BOOL)aBOOL; 
+9

Das Synthetisieren der Eigenschaften sollte ebenfalls funktionieren, da es den Compiler anweist, die Implementierungen der Accessormethode bereitzustellen. –

+0

Danke, Ihr bereitgestellter Code funktioniert einwandfrei, wenn ich die Projektarchitektur auf x86_64 belasse. Wenn ich die Architektur zu i386 ändere, erhalte ich folgende Warnungen: MyCustomClass.m: 13: error: synthetisierte Eigenschaft 'someObject' muss entweder den gleichen Namen wie ein kompatibler ivar haben oder muss explizit einen ivar benennen Fehler: synthetisiert property 'alive' muss entweder der gleiche Name wie ein kompatibler ivar sein oder muss explizit einen ivar benennen Ich möchte nur wissen, warum es in x86_64 mit @synthesize funktioniert und nicht in i386. Danke – AmitSri

+0

Ich versuche, weniger Code zu schreiben, wenn möglich. Bitte erläutern Sie mir auch, was ist der Unterschied zwischen verschiedenen Architekturen und welche soll ich wählen, um die Anwendung zu kompilieren. – AmitSri

1

Ich denke, haben die Dinge, die Sie mit zu tun hat in erster Linie Nebenwirkungen der Einführung von Objective-C 2.0 sind. Sie können beispielsweise Eigenschaften deklarieren, ohne auch Instanzvariablen zu definieren. Aber (wie Sie herausgefunden haben), ist es nur x86_64 und Post-10.5 kompatibel.

+0

Ich habe einen ähnlichen Fehler. Ich habe das Kästchen "built active architect only" für x86_64 aktiviert. Es hat es behoben. – user523234

Verwandte Themen