【问题标题】:Adding own functionality into iOS library将自己的功能添加到 iOS 库中
【发布时间】:2014-11-30 23:52:09
【问题描述】:

我正在使用一个具有相当复杂的继承结构的库(它由几个继承的类组成,例如UITableViewControllerUIViewUITableViewCell 等,其中一些类用于创建自定义对象.

我需要添加一些功能(准确地说,是实现轻击手势识别器)。简单的解决方案是将几行代码放入库的某些类中。
通常,我喜欢将我的代码与库代码分开。是否有可能以某种方式“覆盖”这些类而不重写它们,或者添加一些扩展?

或者唯一的想法是重写所有生成自己的类和大量无用代码的类?

或者只是将自己的代码添加到库中?

补充:
看来,类别是正确的方向,但不是特别是我想要的。这正是我想要的:
我有一个Class1

- (void)someMethod {
doThis;
}

并且没有子类化//编辑我想将其转换为的类:

- (void)someMethod {
doThis;
andThisToo;
}    

类别向一个类添加其他方法,而我需要在已经存在的方法中添加一些功能。

【问题讨论】:

  • 类类别可以工作。
  • @CrimsonChris,谢谢!好的和优雅的解决方案,这就是我想要的!
  • 向此类库的作者提出拉取请求是个好主意吗?
  • 如果您希望作者使用您的更改,最好直接在库的类中添加此功能。如果这是您认为只会被您使用的自定义,那么您不应该直接接触库。请改用类别。
  • CrimsonChris,我添加了一些进一步的解释。似乎类别很接近,但不是我特别想要的。我是对的,现在只有两种解决方案:子类化每个类或向库中添加功能?

标签: ios objective-c class object subclassing


【解决方案1】:

你需要使用装饰器模式。

装饰器模式用于扩展或改变 在运行时通过将对象包装在装饰器的对象中 班级。这为使用继承提供了一种灵活的替代方案 修改行为​​。

由于您提供的示例非常粗略,我无法提供代码示例,但请查看 Wikipedia (http://en.wikipedia.org/wiki/Decorator_pattern)

编辑

我想到了你给的东西,这里是一个装饰器的例子:

@interface Decorator
@property (strong, nonatomic) id decoratedObject;
- (void)someMethod;
@end

@implementation Decorator
- (void)someMethod {
    [self.decoratedObject doThis];
    [self andDoThisToo];
}

@end

【讨论】:

  • 这是一个很好的观点,但正如已经讨论过的,我需要向已经存在的方法添加一些功能。根据此链接:raywenderlich.com/46988/ios-design-patterns,我可以使用类别或代表。这些都不让我满意,所以我最终更改了库的代码。
  • 关于您的编辑:在我的特殊情况下,应该在远离“我的”类并且被深深地放置在库的层次结构中的对象上修改该方法。所以,如果我采用这种方法,我需要更改(或将类别写入)库中的其他类,这不是那么快。
  • 只要装饰器满足与被装饰对象相同的接口,无论对象在库中多远,多深都无所谓。并且装饰器可以通过将所有未修改的调用转发到装饰对象来满足该接口。当然,你必须能够到达你想要装饰的对象,但如果你连这个都做不到,那么也许你应该重新考虑你的设计。也就是说,如果这个想法行不通,那么它就行不通。
  • Daniel,你是完全正确的,但关键是这不是我的架构,我最不想做的事情(实际上,我已经这样做了)是改变它,正如你所说。 Method Swizzling 正是我要问的问题,但它只会使事情变得过于复杂。无论如何,谢谢你的回应。也许,这里的实际点是我正在使用的库仅作为“示例”项目提供,而不是作为库提供,因此它需要通过设计进行修改和“手术干预”
猜你喜欢
  • 2015-07-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-13
  • 1970-01-01
相关资源
最近更新 更多