Iphone 使用Objective-C类别避免编译错误

Iphone 使用Objective-C类别避免编译错误,iphone,objective-c,ios,objective-c-category,Iphone,Objective C,Ios,Objective C Category,我今天做了一件有点恶心的事 我们所有的视图控制器都继承自两个不同的父视图控制器,比如XXXViewController和YYYYViewController。XXXViewController继承自TrackedUIViewController,这是Google Analytics SDK中提供的一个类,因此您的所有视图控制器都可以从中继承并轻松跟踪它们 但是,YYYYViewController继承自不同类型的视图控制器。啊,这是一段开源代码,我真的不想更改 这里有什么问题?我们无法跟踪任何Y

我今天做了一件有点恶心的事

我们所有的视图控制器都继承自两个不同的父视图控制器,比如XXXViewController和YYYYViewController。XXXViewController继承自
TrackedUIViewController
,这是Google Analytics SDK中提供的一个类,因此您的所有视图控制器都可以从中继承并轻松跟踪它们

但是,YYYYViewController继承自不同类型的视图控制器。啊,这是一段开源代码,我真的不想更改

这里有什么问题?我们无法跟踪任何YYYYViewController子项,因为我们无法访问TrackedViewController中提供的方法,因为它们是私有的

我不想修改Google Analytics SDK中提供的源代码。那我做了什么?创建一个公开这些方法的类别,以避免编译错误

这样做的明显缺点是GA源代码的更改可能会中断,但很容易检测到

我想知道这样做可能会遇到什么其他问题,如果你们能想出更好的方法


谢谢

您已经提到了使用未记录API的最大风险:对API的更改超出了您的控制范围,可能会破坏您的逻辑,例如,如果方法被删除/重命名,或者它们的行为不再符合您的期望


从纯技术的角度来看,我看不出还有什么问题,因为在Objective-C中,所有方法都是公开的。只要它们继续存在,您就可以继续调用它们。

您可以进入YYYYViewController的继承链,依次查看它从哪个类继承。如果它是UIViewController,只需在源代码中将特定的超类更改为TrackedUIViewController即可

更好理解的示例:假设
YYYViewController
继承自
ZZZViewController
,后者又继承自
UIViewController
。现在您可以将
ZZZViewController
的超类从
UIViewController
更改为
TrackedUIViewController
——由于
TrackedUIViewController
继承自
UIViewController
,因此不会丢失任何功能,但是神奇的是,您的整个
yyyyviewcontroller
类将变得可跟踪


希望这有帮助:-)

我想说根本问题是过度的子类化。保持视图控制器层次结构浅。使用组合而不是子类化。如果必须使用子类,请确保类提供的功能可以由其子类打开和关闭。

问题是,此YYYYViewController是一个开放源代码组件,我不想修改:)@frowing否则,您无法真正做到这一点。请参阅,将单词
UIViewController
更改为
TrackableUIViewController
应该不会有什么坏处。正如我提到的,你不会失去任何功能。。。