`

通过NSClassFromString得到nil的解决方法

 
阅读更多

<创建于 2013-12-21 20:45:49  注:快累死了,倒霉催的。。。>
通过classString构造class然后实例化一个对象的过程很简单。如下

    NSString *myClassStr = @"myClass";
    Class myClazz = NSClassFromString(myClassStr);
    if (myClazz) {
        id myClassInit = [[myClazz alloc] init];
    }


前不久遇到一个问题,"主工程(MainProject)"调"静态库工程(LibProject)"的方法实例化对象,目标类存在于LibProject中,构造方法如下

+(id)getObjectWithClassName:(NSString *)aClassName {
    id rtnObject = nil;
    Class myClazz = NSClassFromString(aClassName);
    if (myClazz) {
         rtnObject = [[myClazz alloc] init];
    }
    return rtnObject;
}


每次都返回nil,同时很确定的一点是这个类肯定存在,于是在主工程直接反射创建对象,同样是nil。
进一步做了一个实验
1. 在主工程的MainViewController中 #import "MyClassForTest.h"
2. -(void)test {
    NSLog(@"wzf===>%@",[MyClassForTest class]);
    Class myClazz = NSClassFromString(@"MyClassForTest");
    NSLog(@"wzf===>%@",[myClazz class]);
}
这样就能够得到, = =!

搜索了一个google,在stackoverflow中有人提出了同样的问题(http://stackoverflow.com/questions/2227085/nsclassfromstring-returns-nil)
有人提到了文档中的解释 “Return Value :The class object named by aClassName, or nil if no class by that name is currently loaded. If aClassName is nil, returns nil.” 依照其解释,如果返回的是nil的话,要吗不存在这个“aClassName”,要吗是"没有loaded"。排除前一项,只能存在于后一项,那就是“此时未加载”。
因此联想到了,Other Lind Flag中的 “-all_load”设置,这个就是解决问题的关键。
"-all_load"设置方式,选择MainProject.xcodeproject的MainProject(target) 在Build Setting中找到Other Link ... 添加上就可以了
分享到:
评论

相关推荐

    lua-cjson decode中null改成nil

    在Lua的世界里,CJSON(Compact JSON)是一个非常重要的库,它允许我们处理JSON数据,进行编码和解码。...虽然这需要对库源代码进行调整,但通过这种方式,我们可以更好地适应特定的项目需求和数据一致性要求。

    ios-清理模型中的nil.zip

    通过使用这样的工具类,开发者可以更安全地进行字典到模型的转换,避免因为`nil`或`null`导致的程序错误。在实际开发中,此类工具类往往能提高代码的健壮性和可维护性。对于处理网络数据,尤其是在与服务器交互频繁...

    nil_value_error解决办法.md

    nil_value_error解决办法.md

    delphi中提示尚未调用coinitialize错误的解决方法.docx

    例如,在使用 ADO 数据库组件时,调用程序调用该 DLL 时可能会出现“尚未调用 CoInitialize”错误,解决方法是在程序初始化时调用 CoInitialize(nil) 方法。 2. 在使用 TWebBrowser 显示 HTML 文档时或者把 ...

    golang nil接口和空接口

    类型通过实现一个接口的所有方法来实现该接口。既然无需专门显式声明,也就没有“implements”关键字。 接口也是值。它们可以像其它值一样传递。 接口值可以用作函数的参数或返回值。 在内部,接口值可以看做包含值...

    ios-一个关于数组越界、字典key与value为nil情况下导致的低级错误的线上Crash的避免的仓库.zip

    解决方法有: 1. 在访问字典值之前,先检查key是否存在,使用`containsKey:`(Objective-C)或`contains(key:)`(Swift)。 2. 使用可选绑定(Objective-C的`if let`或Swift的`if let`)来安全地解封字典值。 3. ...

    delphi中提示尚未调用coinitialize错误的解决方法.pdf

    例如,在使用 ADO 数据库组件时,可能会出现“尚未调用 CoInitialize”错误,解决方法是在程序初始化时调用 CoInitialize(nil) 方法。同样,在封装 WebBrowser 到 DLL 中时,可能会出现“尚未调用 CoInitialize”...

    Golang TCP粘包拆包问题的解决方法

    ### Golang TCP粘包拆包问题的解决方法 #### 一、引言 在使用Go语言进行网络编程时,特别是TCP编程过程中,经常会遇到所谓的“粘包”与“拆包”问题。这些问题的发生通常会影响到数据的正确性以及系统的稳定性。...

    ios-防止数组越界 字典value为nil导致崩溃.zip

    在字典中,当我们尝试访问一个不存在的key时,会得到`nil`。如果未做处理,直接对这个nil进行操作,程序同样会崩溃。为了避免这种问题,可以使用`NSDictionary`的安全方法`object(forKey:)`,它在key不存在时返回`...

    ios-后台返回数据排空(nsnull nil)处理.zip

    在iOS开发中,后台返回的数据排空,即`...通过以上方法,开发者可以在iOS应用中有效地处理后台返回的`NSNull`和`nil`数据,提高应用的健壮性和用户体验。在实际开发中,应结合项目需求和团队规范灵活运用这些策略。

    带电的Solv和Nil黑洞的热电输运系数

    特别是,我们找到了带电Solv和Nil几何层的解决方案。 我们还发现Nil黑洞具有超标度违规。 对于我们所有的解决方案,我们计算相应双场理论的热电直流输运系数。 我们发现没有超标度违规的Solv和Nil黑洞对金属是双重...

    iOS中json解析出现的null,nil,NSNumber的解决办法

    - **NullSafe Category**:这是一个强大的解决方案,通过Category在运行时将`NSNull`对象自动转换为`nil`,无需额外操作。可以在GitHub上找到这个开源库,将其集成到项目中即可。 3. **深入理解JSON结构** JSON...

    delphi中提示“尚未调用coinitialize错误”的解决方法.docx

    Delphi 中解决 "未调用 CoInitialize" 错误的方法 在 Delphi 开发中,遇到 "尚未调用 CoInitialize" 错误是一种常见的问题。这个错误通常发生在使用 COM 组件或 OLE 对象时,例如使用 ADO 数据库组件或 WebBrowser ...

    对Golang的nil的理解和认识

    1.简介 按照Go语言的规范,任何类型在未初始化的时候都对应一个零值: 布尔型零值为:false ...若对一个值为nil的指针调用其方法或者访问对应类型的属性,则会导致panic. panic: runtime error: invalid mem

    总结IOS中nil、Nil、NULL和NSNull区别

    在Objective-C编程中,了解nil、Nil、NULL和NSNull之间的区别至关重要,因为它们在不同场景下有着不同的用途和含义。下面将逐一详细介绍这些概念。 1. **NULL** NULL是C语言中的一个宏,用来表示空指针。在C语言中...

    Go语言interface 与 nil 的比较

    另一种方法是让`EntityStorage`接口包含一个`Connect()`方法,该方法返回一个错误,这样就可以通过检查错误来判断连接是否成功。 总的来说,理解Go语言中的`interface`和`nil`行为至关重要,尤其是在处理接口值时。...

    nil_value_error如何解决.md

    项目中碰到的,记录一下

    Delphi调用外部程序详解

    ShellExecute(Application.Handle, 'open', 'Notepad.exe', nil, nil, SW_SHOW); 此外,ShellExecute 函数还可以用于打开 URL 地址,例如: ShellExecute(Application.Handle, 'open', 'http://www.neu.edu.cn', ...

    iferr:生成“ if err!= nil {”块

    = nil {”块 if err != nil {当前功能块, if err != nil {生成。 用法 安装和更新方式 $ go get -u github.com/koron/iferr 运行, if err != nil {对于1234字节的位置块,则获取。 $ iferr -pos 1234 &lt; main....

Global site tag (gtag.js) - Google Analytics