Я написал (хорошо проверенную) категорию для NSObject
, которая дает каждому объекту возможность легко хранить данные.
Просто поместите код в заголовок и файл реализации и импортируйте его в любой из вашихпроекты.Или поместите это в статическую библиотеку.Только для Mac OS X 10.6+ и iOS (версия?).
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
@interface NSObject (CCFoundation)
- (id)associativeObjectForKey: (NSString *)key;
- (void)setAssociativeObject: (id)object forKey: (NSString *)key;
@end
#pragma mark -
@implementation NSObject (CCFoundation)
static char associativeObjectsKey;
- (id)associativeObjectForKey: (NSString *)key {
NSMutableDictionary *dict = objc_getAssociatedObject(self, &associativeObjectsKey);
return [dict objectForKey: key];
}
- (void)setAssociativeObject: (id)object forKey: (NSString *)key {
NSMutableDictionary *dict = objc_getAssociatedObject(self, &associativeObjectsKey);
if (!dict) {
dict = [[NSMutableDictionary alloc] init];
objc_setAssociatedObject(self, &associativeObjectsKey, dict, OBJC_ASSOCIATION_RETAIN);
} [dict setObject: object forKey: key];
}
@end
Проще говоря, каждый объект становится простым в использовании словарем (благодаря NSMutableDictionary
), как только он вам понадобится.Словарь освобождается, когда объект есть, и объекты словаря освобождаются, когда словарь освобождается.Удивительно, как Apple сделала это простым.
Предупреждение 1: Приведенный выше код ARC включен .Это хорошо проверено и используется в нескольких отгруженных продуктах.Я еще не видел утечек памяти или проблем с производительностью.
Предупреждение 2: Переименуйте методы по своему усмотрению, но если вы решите сохранить имя, обязательно добавьте префикс,Это категория по корневому объекту, люди.Какой-то класс где-то использует это имя метода, и вы не хотите вмешиваться!Моя статическая библиотека, которую я включаю в каждый проект, использует имена методов associativeCCObjectForKey:
и setAssociativeCCObject:forKey:
.
. Надеюсь, это поможет всем, кто хочет иметь простую userInfo
-подобную функцию для каждого объекта.Пожалуйста!: -)