首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否可以在Objective-C中将-init方法设为私有?

是否可以在Objective-C中将-init方法设为私有?
EN

Stack Overflow用户
提问于 2008-10-12 04:07:41
回答 7查看 42.7K关注 0票数 152

我需要在Objective-C中隐藏(设置为私有)类的-init方法。

我该怎么做呢?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2008-10-12 08:04:51

Objective-C和Smalltalk一样,没有“私有”和“公共”方法的概念。任何消息都可以在任何时间发送到任何对象。

如果您的-init方法被调用,您可以做的是抛出一个NSInternalInconsistencyException

代码语言:javascript
复制
- (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方法就是您访问单例的方式,并将其作为在头中获取单例实例的方式进行记录。在绝大多数情况下,这应该就是您所需要的全部。

票数 89
EN

Stack Overflow用户

发布于 2014-12-30 01:08:15

Apple已经开始在它们的头文件中使用以下内容来禁用init构造函数:

代码语言:javascript
复制
- (instancetype)init NS_UNAVAILABLE;

这在Xcode中正确地显示为编译器错误。具体地说,这是在它们的几个HealthKit头文件(HKUnit是其中之一)中设置的。

票数 101
EN

Stack Overflow用户

发布于 2008-10-12 05:47:27

如果你谈论的是默认的-init方法,那么你就不能这么做,因为它是从NSObject继承的,每个类都会响应它而不会发出任何警告。

你可以创建一个新的方法,比如说-initMyClass,然后把它放在一个私有的类别中,就像马特建议的那样。然后定义默认的-init方法,要么在被调用时引发异常,要么(最好)使用一些默认值调用您的私有-initMyClass。

人们似乎想要隐藏init的一个主要原因是为了singleton objects。如果是这种情况,那么您不需要隐藏-init,只需返回单例对象(如果它还不存在,则创建它)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/195078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档