gpt4 book ai didi

ios - 如何禁止 NSObject 中的基本 init 方法

转载 作者:IT王子 更新时间:2023-10-29 08:13:47 25 4
gpt4 key购买 nike

我想强制用户使用我自己的初始化方法(例如 -(id)initWithString:(NSString*)foo;)而不是基本的 [[myObject alloc]init ];

我该怎么做?

最佳答案

这里的所有其他答案都已过时。现在有一种方法可以正确地做到这一点!

虽然当有人调用您的方法时很容易在运行时崩溃,但编译时检查会更可取。

幸运的是,这在 Objective-C 中已经有一段时间了。

使用 LLVM,您可以像这样在类中声明任何方法不可用

- (void)aMethod __attribute__((unavailable("This method is not available")));

这将使编译器在尝试调用 aMethod 时报错。太棒了!

由于 - (id)init 只是一个普通方法,您可以禁止以这种方式调用默认(或任何其他)初始化程序。

但请注意,这不能确保使用语言的动态方面调用方法,例如通过[object performSelector:@selector(aMethod)] 等。在 init 的情况下,您甚至不会收到警告,因为 init 方法是在其他类中定义的,并且编译器不知道足以给您未声明的选择器警告。

因此,为了防止这种情况发生,请确保 init 方法在被调用时崩溃(参见 Adam's answer)。

如果你想在框架中禁止 - (id)init,确保也禁止 + (id)new,因为这只会转发初始化。

Javi Soto 编写了一个小宏来禁止使用指定的初始化程序更快更容易,并提供更好的消息。你可以找到它here .

关于ios - 如何禁止 NSObject 中的基本 init 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8907793/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com