如果我需要向UIButton添加其他方法,我可以使用 Categories 。是否有任何简单的方法(子类除外)添加额外的实例变量或属性(实例变量+ getter / setter)。 假设我想在UIButton中存储UIColor引用。
PS:这是理论问题。我已经使用子类来实现它,但寻找“更好”的方式。感谢。
答案 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添加到您没有来源的课程中。两种技术接近:类别允许您添加实例方法,但不允许实例变量,类扩展允许您通过声明属性来添加实例变量,但编译器会强制执行这些属性'类的实现块中的方法,您无权访问。它们旨在帮助实现私有接口,而不是真正扩展已经存在的类。