我需要在Objective-C中隐藏(设置为私有)类的-init
方法。
我该怎么做呢?
发布于 2008-10-12 08:04:51
Objective-C和Smalltalk一样,没有“私有”和“公共”方法的概念。任何消息都可以在任何时间发送到任何对象。
如果您的-init
方法被调用,您可以做的是抛出一个NSInternalInconsistencyException
:
- (id)init {
[self release];
@throw [NSException exceptionWithName:NSInternalInconsistencyException
reason:@"-init is not a valid initializer for the class Foo"
userInfo:nil];
return nil;
}
另一种选择-在实践中可能要好得多-是如果可能的话,让-init
为您的类做一些明智的事情。
如果您尝试这样做是因为您试图“确保”使用单例对象,那么请不要费心。具体地说,不要为创建单例的“覆盖+allocWithZone:
,-init
,-retain
,-release
”方法而烦恼。它实际上总是不必要的,只是增加了复杂性,没有真正的显着优势。
相反,只需编写代码,使您的+sharedWhatever
方法就是您访问单例的方式,并将其作为在头中获取单例实例的方式进行记录。在绝大多数情况下,这应该就是您所需要的全部。
发布于 2014-12-30 01:08:15
Apple已经开始在它们的头文件中使用以下内容来禁用init构造函数:
- (instancetype)init NS_UNAVAILABLE;
这在Xcode中正确地显示为编译器错误。具体地说,这是在它们的几个HealthKit头文件(HKUnit是其中之一)中设置的。
发布于 2008-10-12 05:47:27
如果你谈论的是默认的-init方法,那么你就不能这么做,因为它是从NSObject继承的,每个类都会响应它而不会发出任何警告。
你可以创建一个新的方法,比如说-initMyClass,然后把它放在一个私有的类别中,就像马特建议的那样。然后定义默认的-init方法,要么在被调用时引发异常,要么(最好)使用一些默认值调用您的私有-initMyClass。
人们似乎想要隐藏init的一个主要原因是为了singleton objects。如果是这种情况,那么您不需要隐藏-init,只需返回单例对象(如果它还不存在,则创建它)。
https://stackoverflow.com/questions/195078
复制相似问题