繁体   English   中英

在Objective-C中将自定义类注入子类继承树

[英]Inject custom class into subclass inheritance tree in Objective-C

我认为自己是一位经验丰富的Objective-C程序员。 我以应用程序为生,并使用语言功能来充分利用它。 这包括使用运行时对现有框架进行不同的即时更改。 像方法调配和动态子类化这样的东西真的展示了这种语言如何比其他面向对象的C语言更加通用。

但是最近我对一个旧功能有了一些想法,我仍然发现自己需要不时使用,但现在已经被弃用了一段时间。 它是旧的class_setSuperClass的替代品。

我经常发现自己继承了UIKit类,以便扩展它们或者只是略微改变它们的行为。 我最近遇到的一个例子是UIScrollView子类,它为panGestureRecognizer了一些条件。 我通过gestureRecognizer:shouldBeRequiredToFailByGestureRecognizer: UIScrollView然后实现gestureRecognizer:shouldBeRequiredToFailByGestureRecognizer:gestureRecognizer:shouldBeRequiredToFailByGestureRecognizer: .

这必须以这种方式完成,因为您不允许更改滚动视图的平移手势识别器的委托(它将引发运行时异常),并且您无法创建自己的自定义UIScrollView panGestureRecognizer

现在这一切都很好。 我将我的应用程序中的UIScrollView所有用法更改为我新创建的子类,一切都按预期工作。 但是我在整个应用程序中也使用了UITableViewUICollectionView 怎么办? 如您所知,这两个类都是从UIScrollView继承的,而不是我的UIScrollView自定义子类。 因此,我发现自己最终为从UIScrollView继承的每个类(并且在应用程序中使用)编写了相同的代码 多次编写相同的代码是程序员1-2-3禁止。 但我最终编写了一个自定义子类,不仅用于UIScrollView ,还用于UITableViewUICollectionView

现在,在使用class_setSuperClass您可以“调动”已经预先打包的类(如UITableView的超类。 你基本上只是说class_setSuperClass([UITableView class], [MyScrollView class]) ,一切都很好(几乎)很好。 现在,您已经在UITableViewUIScrollView之间注入了自己的类。 因此,每次执行[[UITableView alloc] init]它都具有MyScrollView的功能,因为它直接从它继承。

现在,在iOS 2.0中不推荐使用class_setSuperClass 因为我们可以使用对象的isa指针进行一些调配和黑客攻击。 现在已经被弃用了。

所以我的问题很简单。 你会怎么做?

如果您想全局更改类的行为,而不是使用类标识,直接方法只是替换您想要替换的方法。 运行时仍然允许使用class_replaceMethod() 这似乎是在这里完成你想要的最简单的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM