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

Iphone 在不重复代码的情况下执行init的最佳方法?,iphone,ios,objective-c,xcode,class,Iphone,Ios,Objective C,Xcode,Class,每个视图类都有多个init方法——其中一个已经包含在UIView中,然后是其他的方法——并且每个方法都以相同的方式设置相同的元素。因此,我通常让它们都运行[self initialSetup]方法,其中包括所有这些元素的设置 我遇到的问题是,如果一个子类也有一个initialSetup方法,它将覆盖超类initialSetup方法,因此超类必须使该方法为public才能继续工作。这会导致组织方面的问题,因为除了从init调用方法外,不应该调用该方法,因此没有理由公开。将initialSetup的

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


我遇到的问题是,如果一个子类也有一个initialSetup方法,它将覆盖超类initialSetup方法,因此超类必须使该方法为public才能继续工作。这会导致组织方面的问题,因为除了从init调用方法外,不应该调用该方法,因此没有理由公开。

initialSetup
的名称更改为类似
initialSetupClassName
-子类的名称,即使它们意外使用了相同的模式,不会使用相同的名称,因为它们具有不同的类名


您也可以对不希望被调用的私有方法使用“uu”前缀,但子类程序也可以这样做。

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

如果这是一种风险,通常的做法似乎是将类名合并到setup方法中。因此,您不必使用
initialSetup
而是使用类似于
myviewsublicationsetup
的内容

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

NSAssert([self isMemberOfClass:[ThisClass class]], 
             @"IniitalSetup called by sub- or superclass")
然后,如果子类或超类最终调用init方法,调试构建将引发异常。这将为断点和堆栈跟踪提供一个位置,使您能够非常快速地找到问题


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

不幸的是,
目标C
没有提供一种以“干净”的方式实现这一目标的方法。理想的解决方案是一种受保护的方法。但这在
目标C中是不可能的

苹果在创建
UIgestureRecognitor
时遇到了这个问题。有些方法确实不想被人调用,但必须被子类覆盖。他们选择的处理方法是创建一个单独的头文件(
UIgestureRecognitizerSubclass.h
),其中包含使用这些“受保护”方法的原始
UIgestureRecognitizer
的类别。附加标题只能由子类导入(即用于子类目的)。有关详细信息,请参阅

当然,这并不能防止任何人误用额外的头文件,但至少它清楚地表明了您的意图,并使您的代码结构良好。另外,当您仅使用该类时,您也不会被附加方法的自动完成所“困扰”


就我个人而言,如果没有人直接调用它,那么我只会使用一个额外的标题。在大多数情况下,我认为使用公共方法并记下它的内容是可以的。iOS框架也有许多这样的情况。F.e.
UIViewController
viewDidLoad
等的许多方法。

听起来您缺少指定的初始值设定项。指定一个初始值设定项作为实际执行设置的正式初始值设定项,并让所有其他初始值设定项通过某种程度的定制来调用它。通常指定的初始值设定项是最详细的-例如,如果您有
init
initWithName:
initWithName:age:
initasFiyearld:
,指定的初始值设定项将是
initWithName:age:
,其他初始值设定项将只调用该方法,并适当填充参数