2011-01-04 26 views
4

Ich habe eine Kategorie für NSDate erstellt und ich möchte ein Attribut in dieser Kategorie einkapseln, um einige Daten zu halten. Aber ich kann nicht erreichen, dieses Attribut nur Methoden hinzuzufügen.Objective-C: Attribut zu einer Kategorie hinzufügen

Gibt es eine Möglichkeit, dies zu erreichen?

Vielen Dank.

Antwort

12

Hier einige Code:

Dateiname: NSObject + dictionary.h

#import <Foundation/Foundation.h> 
#import <objc/runtime.h> 
@interface NSObject (dictionary) 
- (NSMutableDictionary*) getDictionary; 
@end 

Dateiname: NSObject + dictionary.m

#import "NSObject+dictionary.h" 
@implementation NSObject (dictionary) 
- (NSMutableDictionary*) getDictionary 
{ 
    if (objc_getAssociatedObject(self, @"dictionary")==nil) 
    { 
    objc_setAssociatedObject(self,@"dictionary",[[NSMutableDictionary alloc] init],OBJC_ASSOCIATION_RETAIN); 
    } 
    return (NSMutableDictionary *)objc_getAssociatedObject(self, @"dictionary"); 
} 

Jetzt jede Instanz (von jeder Klasse) hat ein Wörterbuch, wo Sie Ihre speichern können benutzerdefinierte Attribute Mit Key-Value Coding können Sie einen Wert wie folgt festgelegt:

[myObject setValue:attributeValue forKeyPath:@"dictionary.attributeName"] 

Und Sie können den Wert wie folgt erhalten:

[myObject valueForKeyPath:@"dictionary.attributeName"] 

Dass selbst funktioniert gut mit dem Interface Builder und User Defined Runtime Attribute.

Key Path     Type      Value 
dictionary.attributeName String(or other Type) attributeValue 
+0

Diese Antwort ist unvollständig. Diese Lösung erlaubt es nicht, auf die Eigenschaft/den Ivar von innerhalb der Kategorie aus zuzugreifen, beispielsweise von einer Klassenmethode. – SpaceDog

4

Sie können keine Instanzvariablen in Kategorien hinzufügen.

Sie können jedoch Speicher für ein Attribut zu einem Objekt hinzufügen, indem Sie associative references verwenden. Wenn Sie mehr als ein Attribut hinzufügen müssen, anstatt für jedes eine assoziative Referenz hinzuzufügen, ist es wahrscheinlich besser, einen einzelnen Verweis auf (sagen wir) ein NSMutableDictionary, CFMutableDictionaryRef oder NSMapTable hinzuzufügen und dieses für alle Ihre Attribute zu verwenden .

+0

Danke, werde ich dies lesen und sehen. – Oliver

+0

Wenn ich verstehe, was gesagt wird, kann assoziative Referenz nicht innerhalb der Kategorie, sondern außerhalb für ein Objekt instanziiert werden. Ist das richtig ? – Oliver

0

Wenn Sie Attribut Klasse hinzufügen möchten, können Sie versuchen github.com/libObjCAttr zu verwenden. Es ist wirklich einfach zu bedienen, fügen Sie es über Hülsen, und dann können Sie Attribut wie das hinzufügen:

RF_ATTRIBUTE(YourAttributeClass, property1 = value1) 
@interface NSDate (AttributedCategory) 
@end 

Und im Code:

YourAttributeClass *attribute = [NSDate RF_attributeForClassWithAttributeType:[YourAttributeClass class]]; 
// Do whatever you want with attribute 
NSLog(@"%@", attribute.property1) 
Verwandte Themen