Objective-C的分类无法直接添加实例变量,但我们可以利用关联对象(AssociatedObject)给分类添加属性。为了避免循环引用而需要使用weak修饰符,可以使用OBJC_ASSOCIATION_ASSIGN,OBJC_ASSOCIATION_RETAIN_NONATOMIC等关联对象的内存管理策略。以下是示例代码:
#import <objc/runtime.h>
static char associatedObjectKey;
@interface NSObject (MyCategory)
@property (nonatomic, weak) id myAssociatedObject;
@end
@implementation NSObject (MyCategory)
- (id)myAssociatedObject {
return objc_getAssociatedObject(self, &associatedObjectKey);
}
- (void)setMyAssociatedObject:(id)object {
objc_setAssociatedObject(self, &associatedObjectKey, object, OBJC_ASSOCIATION_ASSIGN);
}
@end
在这个示例代码中,我们使用关联对象给NSObject分类添加了一个名为myAssociatedObject的属性,它是一个弱引用。我们首先定义一个静态变量associatedObjectKey作为关联对象的key。
使用objc_getAssociatedObject函数获取对象的关联对象值,使用objc_setAssociatedObject函数设置对象的关联对象值。
在单例实现中,我们可以使用这个关联对象weak属性来存储单例对象,以防止循环引用。