Objective-C 中类加载时的静态初始化器

发布于 2024-07-26 07:53:46 字数 435 浏览 8 评论 0原文

我正在尝试构建一些东西来从类名动态实例化一个对象,类似于Java的Class.forName方法的工作方式,例如,

Class klass = Class.forName("MyClass");
Object obj = klass.instantiate(...

我在Objective-C中没有看到任何此类行为,所以我想在以下情况下调用一个方法来注册类:加载 Objective-C 类。 基本上,我想调用一个注册我的类的方法,例如,

+ (void)mystatic {
  [NSKeyedUnarchiver setClass:[self class] forClassName:"MyClass"]
}

有没有办法在 OS X 平台上的 Objective-C 中执行此操作?

谢谢。

I am trying to build something to dynamically instantiate an object from class-name similar to how Java's Class.forName method works, e.g.

Class klass = Class.forName("MyClass");
Object obj = klass.instantiate(...

I didn't see any such behavior in Objective-C so I would like to call a method to register Class when an Objective-C class is loaded. Basically, I would like to call a method that registers my class, e.g.

+ (void)mystatic {
  [NSKeyedUnarchiver setClass:[self class] forClassName:"MyClass"]
}

Is there a way to do this in Objective-C on OS X platform?

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

万劫不复 2024-08-02 07:53:46

您想使用 NSClassFromString,如下所示:

Class klass = NSClassFromString(@"MyClass");
id obj = [[klass alloc] init];

You want to use NSClassFromString, like this:

Class klass = NSClassFromString(@"MyClass");
id obj = [[klass alloc] init];
桜花祭 2024-08-02 07:53:46

首先,Objective-C 中确实有这样的等效项 - 正如@Louis 建议的那样,使用 NSClassFromString()。

其次,如果您想要像 Java 中那样的静态构造函数,您也可以使用 +initialize 方法来实现。 请参阅此相关 SO 问题

First, there is indeed such an equivalent in Objective-C — as @Louis suggested, use NSClassFromString().

Second, if you want a static constructor like in Java, you can do that as well with the +initialize method. See this related SO question.

卸妝后依然美 2024-08-02 07:53:46

您也可以说,

Class myClass = [[NSBundle mainBundle] classNamed: @"MyClassName];
id myInstance = [[myClass alloc] init];

这通常有助于解决运行时可能尚未遇到您的类的情况。

You can also say

Class myClass = [[NSBundle mainBundle] classNamed: @"MyClassName];
id myInstance = [[myClass alloc] init];

This frequently helps with cases when the runtime may not have come across your class yet.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文