为什么我们不能在类别中添加iVar?

时间:2012-12-04 10:54:02

标签: objective-c xcode4.5

我首先要注意的是,实际上我们“可以”

只需使用相关对象:

@implementation UIButton (BGButtonWithImages)

static char UIB_ImageOfButton;

-(void)setImageObject:(Image *)imageObject
{
    objc_setAssociatedObject(self, &UIB_ImageOfButton, imageObject, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

-(Image*)imageObject
{
    return (Image*)objc_getAssociatedObject(self, &UIB_ImageOfButton);
}    
@end

但这导致了另一个问题。为什么无法定期使用关联对象轻松完成某些操作?为什么Apple没有在这样的类别中实现属性?

1 个答案:

答案 0 :(得分:4)

合成属性访问器使用实例变量。您不能通过类别添加实例变量,因为不能保证唯一性 - 相同的实例变量可能会被另一个类别添加。

正如您所注意到的,inside-out object pattern允许您在类别中定义访问者,只要关联对象表的键是唯一的。继续使用它是好的。如果您希望第一方编译器支持生成这些访问器,则必须ask Apple