通过添加实例变量扩展现有类

时间:2011-03-29 15:40:59

标签: iphone objective-c cocoa

在Objective-C中

如果我需要向UIButton添加其他方法,我可以使用 Categories 。是否有任何简单的方法(子类除外)添加额外的实例变量或属性(实例变量+ getter / setter)。 假设我想在UIButton中存储UIColor引用。

PS:这是理论问题。我已经使用子类来实现它,但寻找“更好”的方式。

感谢。

3 个答案:

答案 0 :(得分:8)

一种解决方案是使用关联引用;没有像伊娃一样快,但非常有用。

即。给出:

@interface UIButton (color)
@property (nonatomic, retain) UIColor *myPrefixColor;
@end

您可以将其实现为:

@implementation UIButton (color) 
static const char *assocKey = "myPrefixColor associated object key";
- (void) setMyPrefixColor: (UIColor*) aColor
{
    objc_setAssociatedObject(self, &assocKey, aColor, OBJC_ASSOCIATION_RETAIN);
}
- (UIColor*)myPrefixColor;
{
    return objc_getAssociatedObject(self, &assocKey);
}
@end

myPrefix这些东西是因为你应该从不向现有类添加方法,而不会在前面添加一些东西,以便与现有方法发生碰撞(你不是意识到最小化。

答案 1 :(得分:2)

您无法使用类别添加ivars。

答案 2 :(得分:1)

我不认为可以将ivars添加到您没有来源的课程中。两种技术接近:类别允许您添加实例方法,但不允许实例变量,类扩展允许您通过声明属性来添加实例变量,但编译器会强制执行这些属性'类的实现块中的方法,您无权访问。它们旨在帮助实现私有接口,而不是真正扩展已经存在的类。