目标c中的(覆盖)是什么

时间:2013-04-23 02:06:53

标签: objective-c overrides

我正在学习如何在Iphone here

中创建一个popover的教程

这段代码是什么(overrides)

@interface UIPopoverController (overrides)
  + (BOOL)_popoversDisabled;
@end

@implementation UIPopoverController (overrides)

  + (BOOL)_popoversDisabled 
  { 
     return NO;
  }

@end

2 个答案:

答案 0 :(得分:5)

这是一个客观C类。类别是一种在类上提供额外方法的方法,它们在以下情况下很有用:

  • 使用特定于域的功能扩展库类。即提供一些对您的应用程序有用的额外功能。无论您是否拥有该类的源代码,这都有效。例如,您可以实现 [NSString asCreditCard] 方法或 [UIColor applicationThemeColor]
  • 类别对于在复杂类中对相关功能进行分组也非常有用。

Objective-C类别的限制是您无法在类别上定义其他ivars,因此也无法定义ivar支持的属性,尽管您可以使用关联引用轻松解决此问题 - 运行时功能允许您将对象链接到给定的类。

关联参考

要对类别类中的属性或ivar进行“伪造”,请使用以下内容:

定义“键”以引用关联的属性。

static char const* const carNamekey = "com.myObject.aKey"; 

密钥不一定必须有值,因为它是实际使用的对象的内存地址。

现在,实现属性:

- (void) setCar:(Car*)car 
{
    objc_setAssociatedObject(self, &carNamekey, car, OBJC_ASSOCIATION_RETAIN_NONATOMIC);     
}

- (Car*) car 
{
    return objc_getAssociatedObject(self, &carNamekey);
}

如果您希望可以在类别的接口定义上添加@property声明,则邀请该类用户使用property-style(即class.property = xxx)语法。

课程扩展

与Objective-C类别非常相似的另一个特性是类扩展。类扩展是在类的实现块中定义的,如下所示:

@interface MyClass()

有些人将这些称为“空类别”,但这并不完全正确。与类别不同,类扩展允许您在类上定义其他属性和ivars,而无需使用关联引用。这对于创建只读属性,内部可写以及类似的东西很有用。

那里 - 现在你可能比很多人更了解类别:)

答案 1 :(得分:3)

Jasper Blues的回答很好地解释了类别,所以我只想补充一点,你应该避免使用类别来覆盖你要添加类别的类中的方法。原因是类别被添加到类中的顺序是未定义的,因此您无法确定该类是获取方法的版本还是在另一个类别中定义的方法。 如果您需要覆盖类中的方法,请创建一个子类并将覆盖放在那里。

但是,人们有时会使用类别来组织类定义中的方法。如果是这种情况,那么overrides类别中的方法可能意味着覆盖超类中的方法,这很好。