IOS类别-可以在类别之间创建依赖项吗?

IOS类别-可以在类别之间创建依赖项吗?,ios,categories,Ios,Categories,在目标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? 我问的是性能方面和概念方面的问题 编辑: 对于单屏幕应用程序,您有什么建议?类别或

在目标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?
我问的是性能方面和概念方面的问题

编辑:


对于单屏幕应用程序,您有什么建议?类别或扩展该类

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

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

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

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


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

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

对于依赖于类别的类别,如果您确保依赖关系图没有循环,那么您应该可以

最后一点建议是,明确依赖关系

// 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),我仍然显式地导入它。这将在将来的代码更改中避免沮丧。

谢谢您的回答。我开始使用类别是因为我非常喜欢在需要的地方添加功能,只需导入所需的类别。我认识到过度使用的危险,但是,在这一点上,我将大量使用单屏幕应用程序,我看到的唯一可行的选择是要么多次扩展基类以添加功能(这似乎增加了很多不必要的复杂性),要么创建做部分工作的对象,但这意味着性能。移动数据时的开销。您认为什么最适合使用单屏幕应用程序?什么是“移动数据的性能开销?”ObjC中的几乎所有内容都是引用计数的。在对象之间共享数据是没有成本的。通常,您应该将项目分解为更小、更集中的对象。通过组合来组合这些对象几乎总是最好的设计。我曾经考虑过这样一种情况,即当您想要保持事物的解耦(使用通知来传递数据)时,每次都需要对所有内容进行整理和解整理。在这种情况下,使用委托可能是一个更好的解决方案。还有一个问题,当你说“通过导入所需类别在需要的地方添加功能”时,你是什么意思?编译包含类别代码的应用程序时,无论您是否导入,类别代码都会在加载时自动附加到类的每个实例。如果您正在封送数据以进行通知,则表明您没有正确使用数据对象。您可以在通知的userInfo中发布数据对象(并且应该发布)。