Objective-C: добавление атрибута в категорию - PullRequest
4 голосов
/ 04 января 2011

Я создал категорию для NSDate, и я хотел бы инкапсулировать атрибут в этой категории для хранения некоторых данных. Но я не могу добиться добавления этого атрибута, только методы.

Есть ли способ добиться этого?

Спасибо.

Ответы [ 4 ]

12 голосов
/ 01 декабря 2011

Вот код:

Имя файла: NSObject + dictionary.h

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

Имя файла: 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");
}

Теперь у каждого экземпляра (каждого класса) есть словарь, в котором вы можете хранить свои пользовательские атрибуты. С помощью Key-Value Coding вы можете установить значение следующим образом:

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

И вы можете получить значение следующим образом:

[myObject valueForKeyPath:@"dictionary.attributeName"]

Это даже прекрасно работает с Интерфейсным Разработчиком и Определяемыми пользователем Атрибутами времени выполнения.

Key Path                   Type                     Value
dictionary.attributeName   String(or other Type)    attributeValue
4 голосов
/ 04 января 2011

Нельзя добавлять переменные экземпляра в категории.

Однако вы можете добавить хранилище для вашего атрибута к объекту, используя ассоциативные ссылки . Обратите внимание, что если вам нужно добавить более одного атрибута, а не добавлять ассоциативную ссылку для каждого, вам, вероятно, лучше добавить одну ссылку, скажем, в NSMutableDictionary, CFMutableDictionaryRef или NSMapTable и использовать ее для всех ваших атрибутов. .

2 голосов
/ 04 января 2011
0 голосов
/ 14 июня 2014

Если вы хотите добавить атрибут в класс, вы можете попробовать использовать github.com / libObjCAttr . Его очень легко использовать, добавьте его через pods, а затем вы можете добавить такой атрибут:

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

и в коде:

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