当我覆盖一个方法时,如何确定是否需要发送[超级选择器]?

时间:2014-11-26 02:36:06

标签: ios objective-c

需要- (instancetype) init- (void) viewDidLoad[super selector ]等方法,但- (void) drawRect等方法根本不需要向超级发送消息。那么,如果不阅读文档,我怎么知道是否应该发送超级消息?

我没有试图避免阅读文档,我的意思是有任何经验,当我要覆盖一个方法时,我会意识到它需要在我读取之前发送超级消息文档。我要求获得更好地理解这种语言的经验。请不要那么评判。

编辑: LLVM现在支持NS_REQUIRES_SUPER来告诉编译器检查子类方法是否不调用超类。 我已经很长时间没有写OC了,也不知道所有可可代码是否都添加了这个来通知程序员,但我认为这是确保代码运行良好的事情,不仅说"打电话给超级"在文件中。

3 个答案:

答案 0 :(得分:2)

阅读文档是了解问题答案的明确方法。除了学习如何使用Apple提供的课程外,还没有其他替代方法。党的图书馆。

这真的取决于api如何工作,这就是你需要阅读文档的原因。例如,根据文档,方法drawRect:不需要超级:

  

如果直接子类化UIView,则此方法的实现不需要调用super。但是,如果要为不同的视图类创建子类,则应在实现中的某个时刻调用super。

修改:回复您编辑过的问题:我能想到的唯一另一种方法是,如果代码引发错误,您可以确定是否应该使用super当你这样或那样做的时候。如果您不应该使用super或在您不应该使用super时使用{{1}},则可能会出现错误,也可能不会出现错误。有时它可能会给你一个错误,这可能不是很容易调试。其他时候它不会产生任何影响。这是不明确的,因为没有错误并不一定意味着某些事情没有/不会出错。这也有点危险,因为Apple可能会在下一个iOS版本中更改您的代码,因为您没有遵循他们的文档,因此会破坏您的代码。最后一种情况是不会引发错误,但它会破坏代码中的某些内容。这也很模糊,真的难以调试,因为你必须花时间寻找错误的来源等等。 因此,简而言之,依靠任何其他经验(错误或其他方式)而不是阅读文档是不值得的。

答案 1 :(得分:1)

你的问题是:

  

那么我怎么知道我是否应该发送超级消息   没有阅读文档?

答案:你不能。您可以做的最好的方法是尝试调用该方法的超级版本,如果您收到一个未定义的警告,则表示超类不实现该方法。

但我会和其他人一起跳上这个潮流。 阅读文档。一直。

答案 2 :(得分:0)

嗯,一切都很顺利,直到我得到你问题的最后四个字。答案是"阅读文档",我就是这么说的。但你禁止我说出来。因此没有答案;你问了一个自相矛盾的问题,宇宙将在十秒后爆炸。希望你在摧毁它之前享受它!

说真的,你必须不断地查阅文档。这就是它的用途。 Cocoa是一个巨大的封闭框架。你不知道它是如何工作的;你唯一的线索是查阅文档。有些方法会告诉您必须致电super;别人不会。记录方法告诉您调用super时,请调用它!否则,不要。