0

在 Objective C 中创建类别之间的依赖关系可以吗?也在类别和它们的基类之间?

我知道在运行时应该没有区别,它们可能只是在编译时合并在一起。例如,假设我将 B 类分解为:

B(base class)
B+categ1
B+categ2
B+categ3

我的问题是,是否有错误:

a) import B+categ2 and B+categ3 in B.m 
b) import B+categ1 in B+categ3?

我在性能方面和概念上都在问。

编辑:

你对单屏应用有什么建议?类别或扩展该类?

4

2 回答 2

2

它没有什么严重的错误,但它可能表明过度使用类别。虽然它们是解决某些问题的强大工具,并且肯定可以创造一些便利,但我通常不会在它们上构建复杂的系统。

我通常发现过度使用类别是基于太多的IS-A 思维而不是 HAS-A 思维。换句话说,如果你在一个类上放置了很多类别来充当一种奇特的子类化,那么你最好使用组合来代替。与其添加大量的类别方法NSArray(例如),您需要一个具有NSArray属性并提供所需接口的数据对象。

但如果您过度使用类别,这只是建议。让类别导入其他类别没有根本问题。但是,这种说法是不正确的:

我知道在运行时应该没有区别,它们可能只是在编译时合并在一起。

类别在运行时解析,而不是编译时解析。这样做的一个主要危险是,如果两个类别实现相同的方法,那么行为是未定义的。这就是为什么您永远不应该使用类别来覆盖方法,而只是添加它们。

于 2013-08-29T12:47:49.493 回答
0

避免让基类依赖于自身的类别。此规则的例外情况适用于私有类别(使用扩展代替)和打算由基类的子类使用的类别。这些是专门的例外,不应被视为适当的通用解决方案。

对于依赖于类别的类别,如果您确保依赖关系图从不存在循环,那么您应该没问题。

作为最后一点建议,请明确说明依赖关系。

// A+c2
#import "A+c1.h" // A(c2) relies on A(c1) declared methods/properties.
…

// A+c3
#import "A+c1.h" // A(c3) relies on A(c1) declared methods/properties.
#import "A+c2.h" // A(c3) relies on A(c2) declared methods/properties.

即使 A(c3) 通过导入“A+c2.h”隐式包含 A(c1),我仍然显式导入它。这将避免将来代码更改时的挫败感。

于 2013-08-29T12:49:10.207 回答