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



在设计类层次结构时,有时子类添加了一个新的initWithSomeNewParam方法,并且最好禁用对从超类继承的旧init方法的调用。

首先,我已经阅读了这里的问题,其中提出的替代方案是覆盖init以在运行时抛出异常,或者覆盖并设置属性的默认值。在我的情况下,我不想提供默认值,我想明确指出不应该调用旧方法,而应该使用带参数的新方法。

因此,运行时异常是可以的,但除非对代码进行调试,否则团队中的其他程序员无法注意到不再使用旧方法。

如果我是正确的,就没有办法将一个方法标记为"私有"。那么,除了添加评论之外,还有什么方法可以做到这一点吗?

提前谢谢。

您可以在头文件中将init明确标记为不可用

- (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]将返回处于预定义状态并覆盖stuff的对象。

基本上,我的意思是,劝阻[对象初始化]是一种糟糕的做法,尤其是当将来有人将你的子类划分为子类时…。

语法已缩短为:

- (instancetype)init NS_UNAVAILABLE;

相关内容

最新更新