Iphone 使用Objective-C类别避免编译错误
我今天做了一件有点恶心的事 我们所有的视图控制器都继承自两个不同的父视图控制器,比如XXXViewController和YYYYViewController。XXXViewController继承自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
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
应该不会有什么坏处。正如我提到的,你不会失去任何功能。。。