Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 将自定义类注入Objective-C中的子类继承树_Ios_Objective C_Objective C Runtime - Fatal编程技术网

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

Ios 将自定义类注入Objective-C中的子类继承树,ios,objective-c,objective-c-runtime,Ios,Objective C,Objective C Runtime,我认为自己是一个经验丰富的Objective-C程序员。我以应用程序为生,并充分利用语言功能。这包括使用运行时对现有框架进行即时更改。像方法swizzling和动态子类化这样的东西真的展示了这种语言是如何比其他面向对象的C语言更加通用 但最近我一直在思考一个老功能,我仍然发现自己需要不时使用,但现在已经有一段时间被弃用了。它是旧的class_setSuperClass的替代品 我经常发现自己将UIKit类划分为子类以扩展它们,或者只是稍微改变它们的行为。我最近遇到的一个例子是UIScrollVi

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

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

我经常发现自己将UIKit类划分为子类以扩展它们,或者只是稍微改变它们的行为。我最近遇到的一个例子是
UIScrollView
子类,它为
pangestureerecognizer
设置了一些条件。我通过子类化
UIScrollView
实现了这一点,然后实现了
GestureRecognitizer:shouldRequiredtofailbyGestureRecognitizer:

必须这样做,因为您不允许更改滚动视图的平移手势识别器的委托(它将引发运行时异常),并且您不能创建自己的自定义UIScrollView
PangestureRecognitor

现在一切都很顺利。我将我的应用程序中
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:我不认为它会变得特别混乱。对于更复杂的情况,您可能需要多做一些工作(例如,如果您需要类似
的超级
-行为,则需要为原始方法创建一个备份来调用),但这并不是真正的爆炸性复杂性或任何事情。你有什么特别的想法吗?你得到了正确的答案。我认为这是最好的解决方案,因为目前的情况是这样的