varias superponer studio lineas graficos graficas objective-c attributes category

objective c - superponer - Objective-C: agregar atributo a una categoría



superponer graficas en r (4)

Creé una categoría para NSDate y me gustaría encapsular un atributo en esta categoría para contener algunos datos. Pero no puedo lograr agregar este atributo, solo métodos.

¿Hay alguna forma de lograr esto?

Gracias.



No puede agregar variables de instancia en categorías.

Sin embargo, puede agregar almacenamiento para su atributo a un objeto utilizando referencias asociativas . Tenga en cuenta que si necesita agregar más de un atributo, en lugar de agregar una referencia asociativa para cada uno, probablemente sea mejor que agregue una sola referencia a (por ejemplo) un NSMutableDictionary, CFMutableDictionaryRef o NSMapTable y usar eso para todos sus atributos .


Aquí algunos códigos:

Nombre de archivo: NSObject + dictionary.h

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

Nombre de archivo: 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"); }

Ahora, cada instancia (de cada clase) tiene un diccionario, donde puede almacenar sus atributos personalizados. Con Key-Value Coding puede establecer un valor como este:

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

Y puedes obtener el valor así:

[myObject valueForKeyPath:@"dictionary.attributeName"]

Eso incluso funciona muy bien con Interface Builder y los atributos de tiempo de ejecución definidos por el usuario.

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


Si desea agregar un atributo a la clase, puede intentar usar github.com/libObjCAttr . Es realmente fácil de usar, lo agrega a través de pods y luego puede agregar un atributo como ese:

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

Y en el código:

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