我的情况:
ClassA
可能有也可能没有ClassB
类型的父级。因此说[instanceOfA.superview somethingClassBSpecific];
是危险的一半。另外,Xocde会因为合理的原因而变得很脆弱。
这里的建议是在超级视图上发送通知,还是做一些逻辑,例如,
if([objectOfA.superview respondsToSelector:somethingClassBSpecific] != nil){
//...
}
或者在情况允许的情况下创建类型为ClassB
的委托?
答案 0 :(得分:3)
通常情况如此,取决于。使用视图层次结构,通知和委派是对象可以相互通信的三种不同方式。决定哪些(如果有的话)最合适需要考虑相关对象如何相互关联。
通知在对象之间提供非常松散(几乎为零)的耦合。它们还提供一对多通信 - 您发布通知,并且正在侦听该通知的每个对象都将获得该消息。但通知并不总是合适的;沟通主要只在一个方向,滥用通知机制可能导致性能问题。
委派为您提供了一种自定义对象行为的方法。最明显的例子是应用程序委托。大多数iOS应用程序都基于同一个类:UIApplication。即使每个应用程序都有自己的功能,UIApplication也适用于每个应用程序。应用程序对象使用委托来提供自定义,为应用程序提供其独特的行为。
视图层次结构是(某些)对象彼此连接的另一种方式。如果您正在实现的行为是a)视图的一部分,b)依赖于该视图与其他视图的关系,那么使用superview
和subviews
属性可能是有意义的。
那么,您尝试实现哪种功能?
答案 1 :(得分:2)
这取决于您的逻辑模型。如果您有一个实现具有可选方法的协议的类的实例,那么当您尝试调用其中一个可选方法时,使用respondsToSelector:
是合适的。如果您希望调用的方法是必需的,请在您传递的类中创建一个无操作的“警卫”。这两种技术都是有效的,只是您是否希望您的用户意识到需要实施特定方法。