在目标C中,是否有可能使-init方法成为privatemethod?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (11)

我需要隐藏我在Objective-C中的-init method。该怎么做到?

提问于
用户回答回答于

Objective-C与Smalltalk一样,没有“私有”与“公共”method的概念。

你可以做的是抛出一个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;
}

用户回答回答于

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;

扫码关注云+社区