Ios 将自定义类注入Objective-C中的子类继承树
我认为自己是一个经验丰富的Objective-C程序员。我以应用程序为生,并充分利用语言功能。这包括使用运行时对现有框架进行即时更改。像方法swizzling和动态子类化这样的东西真的展示了这种语言是如何比其他面向对象的C语言更加通用 但最近我一直在思考一个老功能,我仍然发现自己需要不时使用,但现在已经有一段时间被弃用了。它是旧的Ios 将自定义类注入Objective-C中的子类继承树,ios,objective-c,objective-c-runtime,Ios,Objective C,Objective C Runtime,我认为自己是一个经验丰富的Objective-C程序员。我以应用程序为生,并充分利用语言功能。这包括使用运行时对现有框架进行即时更改。像方法swizzling和动态子类化这样的东西真的展示了这种语言是如何比其他面向对象的C语言更加通用 但最近我一直在思考一个老功能,我仍然发现自己需要不时使用,但现在已经有一段时间被弃用了。它是旧的class_setSuperClass的替代品 我经常发现自己将UIKit类划分为子类以扩展它们,或者只是稍微改变它们的行为。我最近遇到的一个例子是UIScrollVi
class_setSuperClass
的替代品
我经常发现自己将UIKit类划分为子类以扩展它们,或者只是稍微改变它们的行为。我最近遇到的一个例子是UIScrollView
子类,它为pangestureerecognizer
设置了一些条件。我通过子类化UIScrollView
实现了这一点,然后实现了GestureRecognitizer:shouldRequiredtofailbyGestureRecognitizer:
必须这样做,因为您不允许更改滚动视图的平移手势识别器的委托(它将引发运行时异常),并且您不能创建自己的自定义UIScrollViewPangestureRecognitor
现在一切都很顺利。我将我的应用程序中UIScrollView
的所有用法都更改为我新创建的子类,一切都按预期进行。但是我在整个应用程序中也使用了UITableView
和UICollectionView
。这些怎么办?正如您所知,这两个类都是从UIScrollView
继承的,但不是我的UIScrollView
的自定义子类。因此,我发现自己最终为从UIScrollView
继承的每个存在的类(以及应用程序中使用的类)多次编写相同的代码。多次编写相同的代码是程序员的一个难题。但我最终不仅为UIScrollView
编写了一个自定义子类,还为UITableView
和UICollectionView
编写了一个自定义子类
现在,在过去使用class_setSuperClass
时,您可以“swizzle”已经预先打包好的类的超类,如UITableView
。你基本上只是说了class\u setSuperClass([UITableView class],[MyScrollView class])
,一切都很好(几乎都很好)。现在,您已经在UITableView
和UIScrollView
之间注入了自己的类。因此,每次执行[[UITableView alloc]init]
时,它都具有MyScrollView
的功能,因为它直接从它继承
现在,iOS 2.0中不推荐使用class_setSuperClass
!因此,我们可以使用对象的isa
指针进行一些swizzling和Hack操作。现在这一点也遭到了反对
所以我的问题很简单。您将如何处理此问题?如果您希望全局更改类的行为,而不是使用类标识,那么直接的方法就是替换您希望替换的方法。运行时仍然允许使用
class\u replaceMethod()
。这似乎是实现你在这里想要的最简单的方法。是的,我同意。既然你提到了,我不明白为什么我没有做到。但是,如果这是一个包含大量重写方法的复杂子类呢?这种方法不会有点混乱吗?@Trenskow:我不认为它会变得特别混乱。对于更复杂的情况,您可能需要多做一些工作(例如,如果您需要类似的超级-行为,则需要为原始方法创建一个备份来调用),但这并不是真正的爆炸性复杂性或任何事情。你有什么特别的想法吗?你得到了正确的答案。我认为这是最好的解决方案,因为目前的情况是这样的