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

Iphone 通过添加实例变量扩展现有类,iphone,objective-c,cocoa,Iphone,Objective C,Cocoa,在Objective-C中,如果我需要向UIButton添加其他方法,我可以使用类别。是否有任何简单的方法(子类化除外)来添加额外的实例变量或属性(实例变量+getter/setter)。 假设我想在UIButton中存储UIColor引用 附言:这是一个理论问题。我已经使用子类化实现了这一点,但正在寻找“更好”的方法 谢谢。我认为不可能将IVAR添加到没有源代码的类中。两种技术非常接近:类别允许您添加实例方法,但不允许添加实例变量;类扩展允许您通过声明属性添加实例变量,但编译器从类的实现块中强

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

附言:这是一个理论问题。我已经使用子类化实现了这一点,但正在寻找“更好”的方法


谢谢。

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

不能使用类别添加IVAR。

一种解决方案是使用关联引用;没有ivars那么快,但非常有用

即给定:

@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
的原因是,如果不在现有类前面加上前缀,就不应该在现有类中添加方法,以免与现有方法发生冲突(您不知道)我认为实现部分应该是
UIColor
而不是
NSString
,对吗?我认为在我的情况下,最好使用子分类,因为我不需要100%的UIButton实例的功能。无论如何,我很高兴知道;肌肉记忆掩盖了我这么多年来一直在做的事情。谢谢。:)是的,子类化是一种方法。你可能是对的——它不是为了添加i-vars而设计的。但无论如何,这是可能的!