猿问
回到首页
个人中心
反馈问题
注册登录
下载APP
首页
课程
实战
体系课
手记
专栏
慕课教程
是否可以在Objective-C中将-init方法设为私有?
我需要
-init
在Objective-C中隐藏(设为私有)我的类的方法。
我怎样才能做到这一点?
POPMUISE
浏览 786
回答 3
3回答
繁星点点滴滴
与Smalltalk一样,Objective-C也没有“私有”与“公共”方法的概念。任何消息都可以随时发送到任何对象。您可以做的是在调用NSInternalInconsistencyException您的-init方法时抛出:- (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方法成为访问单例的方式,并将其记录为在标头中获取单例实例的方式。在绝大多数情况下,这就是您所需要的。
0
0
0
慕娘9325324
NS_UNAVAILABLE- (instancetype)init NS_UNAVAILABLE;这是不可用属性的简短版本。它首先出现在macOS 10.7和iOS 5中。在NSObjCRuntime.h中将其定义为#define NS_UNAVAILABLE UNAVAILABLE_ATTRIBUTE。有一个版本仅对Swift客户端禁用此方法,而不对ObjC代码禁用:- (instancetype)init NS_SWIFT_UNAVAILABLE;unavailable将unavailable属性添加到标头,以在每次调用init时生成编译器错误。-(instancetype) init __attribute__((unavailable("init not available"))); 编译时错误如果没有理由,请输入__attribute__((unavailable)),甚至__unavailable:-(instancetype) __unavailable init; doesNotRecognizeSelector:使用doesNotRecognizeSelector:提出一个NSInvalidArgumentException。“只要对象收到无法响应或转发的aSelector消息,运行时系统就会调用此方法。”- (instancetype) init { [self release]; [super doesNotRecognizeSelector:_cmd]; return nil;}NSAssert使用NSAssert抛出NSInternalInconsistencyException并显示一条消息:- (instancetype) init { [self release]; NSAssert(false,@"unavailable, use initWithBlah: instead"); return nil;}raise:format:使用raise:format:抛出自己的异常:- (instancetype) init { [self release]; [NSException raise:NSGenericException format:@"Disabled. Use +[[%@ alloc] %@] instead", NSStringFromClass([self class]), NSStringFromSelector(@selector(initWithStateDictionary:))]; return nil;}[self release]因为该对象已经被alloc吃掉而需要。使用ARC时,编译器会为您调用它。无论如何,当您有意停止执行时,不必担心。objc_designated_initializer如果您打算禁用init强制使用指定的初始化程序,则可以使用以下属性:-(instancetype)myOwnInit NS_DESIGNATED_INITIALIZER;除非myOwnInit内部有其他初始化方法调用,否则将生成警告。下一个Xcode发布后,详细信息将发布在“ 采用现代Objective-C”中(我想)。
0
0
0
汪汪一只猫
Apple已开始在其头文件中使用以下命令禁用init构造函数:- (instancetype)init NS_UNAVAILABLE;这在Xcode中正确显示为编译器错误。具体来说,这是在其几个HealthKit头文件中设置的(HKUnit是其中之一)。
0
0
0
打开App,查看更多内容
随时随地看视频
慕课网APP
相关分类
Swift
iOS为什么要获取webview内容高度?
1 回答
关于Swift Playgrounds 编程问题?
1 回答
iOS
继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续