问题标签 [class-extensions]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1228 浏览

objective-c - 链接器找不到应该存在的类

我有一个使用 Core Telephony 框架的项目。最近我的代码停止在一个CTCarrier类别上工作,链接器抱怨它找不到这个CTCarrier类:

这是触发上述错误的示例代码:

如果我将类别更改为类扩展,代码会突然生成:

这是怎么回事?GitHub 上的示例代码。

0 投票
1 回答
2434 浏览

objective-c - 在类扩展中声明新属性在 Objective-C 中是一种不好的做法吗?

类扩展的一个强大优势是,通过类扩展,您可以在头文件中声明一个只读属性,并在类扩展中将该属性覆盖为读写属性。如下所示:

但是,如果您使用现代运行时,您还可以在类扩展中声明一个全新的属性(如果没有,它也会为该属性生成一个 iVar)。

这是我的问题:我认为在类扩展中声明一个全新的属性在某种程度上会产生一些副作用。因为类扩展名不在头文件中,并且子类化该类的其他人可能不知道该“秘密属性”。如果他声明一个与该“秘密财产”同名的财产。而这个新属性的 getter 和 setter 方法将覆盖超类的。这不是问题吗?为什么现代运行时会允许这样的事情发生?

编辑我发布了关于这个主题的另一个问题,请查看: 在类扩展中声明新属性的风险(Ojbective-C),如何解决?

0 投票
2 回答
8432 浏览

objective-c - Objective-C 中属性覆盖的危害是什么?

在几种情况下,您可能会覆盖超类的属性。

  1. 您声明一个与其超类具有相同名称和相同属性的属性。(因为如果您更改属性,您会收到编译器警告)。您可以使用您创建的 ivar 进行综合。这有什么用?或者它有什么害处?

  2. 如果超类在类扩展(没有名称的类别)中声明了一个属性,那么它可能不在头文件中。如果您不知道头文件中的该属性,则可以使用您想要的任何属性或类声明同名属性。但是 setter/getter 方法将覆盖那些“秘密属性”。我认为这只会造成伤害。但是既然从头文件中不知道,那怎么避免呢?

  3. 您可以在头文件中将属性声明为“只读”,并在类扩展中将其重新声明为“读写”。我认为这是它可以做得很好的情况。

我对这些情况的理解正确吗?而且我不知道第一种和第二种情况有什么好处。但是如果我想避免第一种情况,我可以在声明之前检查子类是否已经具有该属性。但是如果属性不在公共头文件中,就像第二种情况一样,我只是不知道该怎么办。

0 投票
1 回答
280 浏览

objective-c - 类接口中的 ivar 和声明的属性(现代运行时)创建的 ivar 有什么区别?

在现代运行时。您可以声明属性,而无需在接口中声明同名 ivar,例如

而且我知道,这会自动为您生成一个 str1 ivar,因为在实现中,您可以同时访问两者self.str1或纯粹访问str1

但我的问题是,str1和str2有什么区别吗?

如果它们相同,为什么类扩展(没有名称的类别)允许添加一个新的声明属性,该属性也会生成一个 ivar,但不允许在类扩展中添加一个 ivar 实例?(我知道 LLVM 2.0 或更高版本允许这但 gcc 没有)

0 投票
4 回答
2091 浏览

c# - 存在不同程序集时的部分/扩展类或接口

我使用一种方法来处理异常 - 它在内部写入数据库,但是当发布到网络时,源代码将不包含写入数据库所需的连接字符串。相反,它应该写入日志文件。

是否可以在 Foo.Private.dll 不存在时写入日志,但在存在时写入数据库?

...

我曾考虑让两个日志类实现一个共享接口(而不是扩展和覆盖)并创建一些工厂方法来呈现它,但不确定如何验证程序集的存在或在不添加引用的情况下使用它的类型,在这种情况下最终项目将有一个循环引用。

0 投票
3 回答
4088 浏览

objective-c - Objective-C:我应该声明私有方法吗?

根据在 Objective-C 中为类定义私有方法的最佳方式,我一直在类扩展中声明私有方法。

但是,我刚刚意识到,在 Xcode 4 中,如果我完全省略了私有方法的声明并只实现它,应用程序将编译并运行而不会发出警告或错误。

那么,我是否应该费心在类扩展中声明私有方法?

为什么我们必须声明方法呢?在 Java 中,你不会……在 Ruby 中也不会。

0 投票
0 回答
202 浏览

xcode - Xcodes 代码完成中类扩展中方法的可见性

我看到了一个类似的问题,解决了 Xcode 3.2 和 Xcode 4 之间代码完成的差异。我的问题解决了 Xcode (3.2) 的特定行为。

当我在类扩展中声明“私有”方法时,这些方法在代码完成列表中是可见的,它们不应该是可见的。

一个例子(AClass.m):

当我将 AClass.h 导入其他类并创建 AClass 实例时......

Xcode 的代码补全显示了“私有”方法“someMethod”:

那时,这个方法是可见的,即使它不应该是可见的,因为它在这里是未知的——它没有在头文件中定义。如果我在那个时候发送消息 [test someMethod] 并构建这个东西,我会收到一个警告,该对象可能没有响应 - 正如预期的那样。

它确实响应,但这是令人困惑的行为,特别是对于想要使用我的课程的其他人。

这也会影响@property / @synthesize,因为它们“只是替代方法”。我想通过属性访问我所有的私有 ivars,因为 a)具有同质代码,而 b)能够影响 ivars 的使用(如惰性实例化)。另一方面,任何使用我的类的人都不应该看到所有私有的东西(在代码完成中),以便更容易使用它们。

有没有办法改变这种行为?

是 Xcode 3.2 中缺少上下文验证的原因,为什么代码完成显示这种方法,它们不应该是可见的?

Xcode 4 中的行为是否不同(因为上下文验证)?

I still use Xcode 3.2, because I wanted to finish a project before switching and adapting myself to Xcode 4.

0 投票
2 回答
1496 浏览

objective-c - 在 Objective-C 中使用类扩展来实现选择性可见性

.h将类扩展放在他们自己的文件中并#import有选择地获得类的方法和属性的不同级别的可见性是否有意义?如果这是一个坏主意(或行不通),为什么?

0 投票
4 回答
60716 浏览

objective-c - 类扩展与类类别

类扩展@interface Class () 功能更强大,可以将变量注入到类中。分类@interface Class (Category)不行。

还有什么其他区别,什么时候应该使用类别而不是类扩展?

0 投票
2 回答
1410 浏览

objective-c - 类扩展中的 IBAction 方法?

在类扩展中定义与 .xib IBAction关联的所有 () 方法是一种好的编程习惯吗?NSViewController