4

我正在关注如何在 Iphone 中创建弹出框的教程

这是什么(overrides)代码:

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

@implementation UIPopoverController (overrides)

  + (BOOL)_popoversDisabled 
  { 
     return NO;
  }

@end
4

2 回答 2

5

这是一个objective-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 声明,以邀请该类的用户使用属性样式(即class.property = xxx)语法。

类扩展

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

@interface MyClass()

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

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

于 2013-04-23T02:48:43.900 回答
3

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

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

于 2013-04-23T03:30:29.953 回答