在不重复代码的情况下执行init的最佳方法

And*_*rew 5 iphone xcode class objective-c ios

每个视图类都有多个init方法 - 已经作为UIView的一部分包含的方法,然后是其他方法 - 并且每个方法都以相同的方式设置相同的元素.因此,我通常让它们都运行一个[self initialSetup];方法,其中包括设置所有这些元素.

我遇到的问题是,如果一个子类也有一个initialSetup方法,它将覆盖超类的initialSetup方法,因此超类必须将该方法公开才能仍然起作用.这会导致组织问题,因为除了init之外永远不应该调用该方法,因此没有理由公开.

Tom*_*mmy 2

您遇到了一个没有完美解决方案的问题。理想情况下,您拥有的方法不能在正常意义上进行子类化,只能由该确切类型的类的实例访问。

如果存在风险,通常的做法似乎是将类名合并到设置方法中。所以initialSetup你会得到类似的东西myViewSubclassInitialSetup

您还可以在方法的顶部添加类似的内容:

NSAssert([self isMemberOfClass:[ThisClass class]], 
             @"IniitalSetup called by sub- or superclass")
Run Code Online (Sandbox Code Playgroud)

然后,如果子类或超类最终调用您的 init 方法,您的调试版本将引发异常。这将为您提供一个断点和堆栈跟踪的位置,让您能够非常快速地找到问题。

它不会向您的发布版本添加任何代码。