ios - 来自 NSClassFromString 的自定义初始化

标签 ios objective-c runtime

我尝试动态调用某些 viewController/Feature 取决于他的名字。NSClassFromString
(这种想法是由 Facebook 提出的)。 对于来 self 的服务器的实例,我可以在 IOS 应用程序中定义应该使用哪个功能或 viewController。(或打开/关闭它们)
我搜索了整个 Stack,但仍然找不到一种优雅的方式来实现我想要的

   Class myclass = NSClassFromString(className);
   id obj = [[myclass alloc] init];

会起作用。
但我想调用我的自定义 init。

Class myclass = NSClassFromString(className);
id obj = [[myclass alloc] initWithCostumInitializer:userInfo];

我找不到合适的方法来做到这一点。当然,每次我收到一个错误,因为 initWithCostumInitializer 没有被识别。所以我需要在运行时做出决定。我相信我错过了一些东西。

非常感谢。

最佳答案

首先,如果将可能类的 header 导入到运行此代码的 .m 文件中,您不应该得到关于未知方法的编译时错误。正是由于这种动态性,ObjC 应该允许您在 id 类型的对象上调用相当任意的方法。

但这只是一个创可贴解决方案。真的,如果您知道存在自定义初始化方法,那么它就不是任意类,对吧?您知道它是什么类型的对象,或者至少知道它派生自什么类型的基类,否则您将不知道调用该方法。所以你总是可以:

id customObj = [((BaseViewController *)[myclass alloc]) initWithCustumInitializer:userInfo];

如果您的错误是关于接收器缺少该选择器的运行时错误,那么您就会遇到真正的问题,即:为什么要在可能不是那种类型的对象上调用命名方法具有该方法的对象?如果是这种情况,您需要首先查看类以弄清楚您实际要创建的是什么类型的东西,然后为 init 做出适当的行为。

关于ios - 来自 NSClassFromString 的自定义初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28658700/

相关文章:

ios - 如何在 VOIP 通话断开后关闭 Callkit 屏幕

ios - 当跨任何事件导航到特定 UIViewcontroller 时,应用程序仅在 iOS 11 中崩溃

iphone - 加载文件时捕获 EXC_BAD_ACCESS 的方法

objective-c - Xcode 4.5 : Internal error [IRForTarget] 中出现奇怪的 LLDB 错误

ios - 我想在 iOS 5.x 中隐藏一个 Button 但在 iOS 6.x 中不

ios - 如何在 Xcode 中正确使用 iOS Runtime Headers?

haskell - 递归方法如何工作?

ios - 如何获取网站的 HTML 内容

ios - 这个错误是什么意思? Xcode : "Mach-O Librarian.... Log complete" Coreplot

c# - 在运行时将类类型传递给泛型方法