防止其他程序员调用-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调用的方法(以及在文档中弃用的标记)。