gpt4 book ai didi

objective-c - objective-c 中的(覆盖)是什么

转载 作者:太空狗 更新时间:2023-10-30 04:00:11 24 4
gpt4 key购买 nike

我正在学习如何在 Iphone 中创建弹出框的教程 here

什么是(overrides)这段代码:

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

@implementation UIPopoverController (overrides)

+ (BOOL)_popoversDisabled
{
return NO;
}

@end

最佳答案

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

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

Objective-C 类别有一个限制,即您不能在类别上定义额外的 ivar,因此不能定义 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);
}

如果您愿意,可以在类别的接口(interface)定义上添加@property 声明,以邀请类的用户使用属性样式(即class.property = xxx)语法。

类扩展

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

@interface MyClass()

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

好了 - 现在您可能比很多人更了解类别:)

关于objective-c - objective-c 中的(覆盖)是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16159697/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com