在设计类层次结构时,有时子类添加了一个新的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;