2009-04-05 4 views
1

Alle Beispiele von Kategorien, die ich gesehen habe, verwenden eine Objective-C-Klasse anstelle einer benutzerdefinierten Klasse. Zum Beispiel: NSMutableArray, NSArray, NSString. Ich möchte eine Kategorie für eine benutzerdefinierte Klasse erstellen. Hier ist ein nutzloses Beispiel, das ich gerade erstellt testen, aber nicht Compilation:Können Kategorien nur für Objective-C-Klassen erstellt werden?

//person.h 
@interface Person (aCategory) : NSObject { 
NSString *MyName; 
NSString *webAddress; 
} 
@property(nonatomic, retain) NSString *MyName; 
@end 

//person.m 
#import "Person+aCategory.h" 

@implementation Person 
@synthesize MyName; 
@end 

Und die Kategorie Definition:

@interface aCategory : NSObject { 
NSString *webAddress; 
} 
@property(nonatomic, retain) NSString *webAddress; 
- (void)changeWebAddress; 
@end 

//in aCategory.h 
#import "aCategory.h" 

@implementation aCategory 
@synthesize webAddress; 

- (void) changeWebAddress{ 
self.webAddress = @"http://www.abc.com"; 
} 
@end 

Dies wird die folgenden Fehler und Warnung geben:

error: Person+aCategory.h: no such file or directory 
warning: cannot find interface declaration for Person 
error: no declaration of property 'MyName' found in interface 

Gibt es eine Möglichkeit, dies zu tun?

Antwort

3

Eine benutzerdefinierte Objective-C-Klasse, die Sie definieren, ist immer noch eine Objective-C-Klasse. Sie können Kategorien für sie erstellen, ja. Das Problem hier ist, dass das, was Sie geschrieben haben, nicht der richtige Weg ist, um eine Kategorie zu definieren.

Zuerst definieren Sie eine einfache Klasse. Sie geben alle Ihre Instanzvariablen und die von Ihnen gewünschten Methoden ein.

Dann definieren Sie eine Kategorie, die Methoden zu der Klasse hinzufügt. Kategorien stammen nicht von einer Elternklasse oder haben Ivars, da sie einfach Methoden zu einer vorhandenen Klasse hinzufügen.

Vollständige Dokumentation siehe Apples The Objective-C Programming Language.

+0

>> Das hier Problem ist, dass Sie, was schrieben nicht aus der Ferne ist der richtige Weg um eine Kategorie definieren << Ok.. Kannst du mein Beispiel korrigieren? – 4thSpace

1

Sie können eine Kategorie für jede Objective-C-Klasse erstellen. Normalerweise zeigen die Beispiele Kategorien in den NS-Klassen, da Sie normalerweise nicht in der Lage sind, die Klasse direkt zu ändern, was Sie tun würden, wenn Sie den Quellcode für die Klasse hätten.

Ich verwende normalerweise Kategorien für meine eigenen Klassen für die privaten Methoden, aber ich erstelle keine separate Klasse für sie, ich erkläre nur die @ Schnittstelle der Kategorie in der .m-Datei.

Here's a link zu einer Antwort, die die Verwendung von Kategorien zusammenfasst.

der Kommentar Dies ist nach einer Möglichkeit, den Code neu zu schreiben:

//person.h 
@interface Person : NSObject { 
    NSString *myName; 
    NSString *webAddress; 
} 
@property(nonatomic, copy) NSString *myName; 
@property(nontatomic, copy) NSString *webAddress; 
@end 

//person.m 
#import "Person.h" 

@interface Person (aCategory) 
- (void)changeWebAddress; 
@end 

@implementation Person 
@synthesize myName; 
@synthesize webAddress; 
@end 

@implementation Person (aCategory) 
- (void)changeWebAddress { 
    self.webAddress = @"http://www.abc.com"; 
} 
@end 
+0

Ich habe versucht, Code aus dem Link auf das, was ich habe, anzuwenden, aber ich bekomme immer noch einen Fehler: kann keine Deklaration der Schnittstelle für Person finden. – 4thSpace

+0

Ich habe die Antwort aktualisiert, die zeigt, wie ich die Schnittstellen- und Implementierungsdateien neu schreiben würde. – Abizern

+0

Danke. Ich sehe den Vorteil der Kategorie nicht. Es sieht so aus, als ob Person mit der changeWebAddress-Methode einwandfrei funktionieren kann, ohne etwas von aCategory zu benötigen. – 4thSpace

Verwandte Themen