防止其他程序员调用-init的最好方法

在devise类层次结构时,有时子类已经添加了一个新的initWithSomeNewParam方法,并且希望禁用对从超类inheritance的旧的init方法的调用。

首先,我在这里读到了这个问题,其中提出的替代方法是覆盖init以在运行时抛出exception,或覆盖并设置属性的默认值。 在我的情况下,我不想提供默认值,我想清楚地指出不应该调用旧的方法,而应该使用带有参数的新方法。

所以运行时exception是好的,但是除非代码被debugging,否则团队中的其他程序员没有办法注意到旧方法不再被使用。

如果我是正确的,那么就没有办法将方法标记为“私人”。 所以,除了添加评论,有没有办法做到这一点?

提前致谢。

你可以明确地标记你的头文件不可用:

 - (id) init __unavailable; 

要么:

 - (id) init __attribute__((unavailable)); 

有了后面的语法,你甚至可以给出一个理由:

 - (id) init __attribute__((unavailable("Must use initWithFoo: instead."))); 

如果有人试图调用它,编译器会发出错误(不是警告)。

要添加到@DarkDust发布的内容,您可以使用UNAVAILABLE_ATTRIBUTE

 - (id)init UNAVAILABLE_ATTRIBUTE; 

当用户试图在这个类的一个实例上调用init时,这会引发错误。

标记它已弃用? 开发者将是开发者,你不能阻止我们所有人! 😉

如何在Objective-C 2.0中将某个方法标记为弃用?

initWith:Stuff和:OtherStuff不应该超过便利的构造函数。

在那他们有效地应该打电话

 self = [self init]; if(self) { self.stuff = Stuff; self.other = OtherStuff; } 

所以[object init]将始终返回一个处于预定义状态的对象,而[object initWithStuff:stuff]将返回处于预定义状态的对象,并重写该对象。

基本上我得到的是,它的不好的做法是阻止[对象初始化],特别是当有人在将来子类化子类时。

你可以通过为你的类定义一个私有扩展来标记一个方法为“private”。

在你的.h:

 @interface MyClassName - (void)initWithSomeNewParam:(id)param; 

在你的.m:

 @interface MyClassName () - (void)init; @end 

你也可以添加一个NSLog语句,当任何人使用附加的XCode会话运行项目时,他们将看到类似于“请不要使用init ,使用initWithSomeNewParam: ”的控制台输出。 请注意,这是苹果公司历史上采用的不赞成API调用的方法(以及在文档中弃用的标记)。