OC静态库里NSClassFromString得到nil的解决

如果你在静态库中有从类名反射回类的代码, 如下:

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

有时候(经常)会出现得到了Class为nil的情况, 网上搜索, 一般是这么说的:

The class object named by aClassName, or nil if no class by that name is currently loaded. If aClassName is nil, returns nil.

来自于64位系统的一个bug:

IMPORTANT: For 64-bit and iPhone OS applications, there is a linker bug that prevents -ObjC from loading objects files from static libraries that contain only categories and no classes. The workaround is to use the -all_load or -force_load flags. -all_load forces the linker to load all object files from every archive it sees, even those without Objective-C code. -force_load is available in Xcode 3.2 and later. It allows finer grain control of archive loading. Each -force_load option must be followed by a path to an archive, and every object file in that archive will be loaded.

就我的实测
首先, 你需要在你的主项目(的target)对build setting进行更改, 而不是静态库的项目!
其次, -all_load有效, -force_load甚至编译都过不了
最后, 结合上面, 就是在主项目(引用静态库的项目)的build setting里面搜索other linker flags, 然后把-all_load加进去就行了

时间: 2024-10-27 02:29:37

OC静态库里NSClassFromString得到nil的解决的相关文章

静态库里的静态变量

我们知道,在C语言里面的静态变量,在程序运行上只有一份拷贝, 在程序的任何一处改变其值后, 其他地方再调用会得到已经修改后的值, 因此可以当做一个全局变量来使用. 但是,当系统比较庞大时,经常会将一些功能代码编译成各种库来调用,这里的库有静态库和动态库. 问题是, 当一个静态变量是定义在一个静态库里面时, 它是不是也只有一份拷贝呢,答案是不一定. 考虑这样的一个情况, 有一个静态库liba, 包含了静态变量x, 还有两个动态库dlib1, dlib2, 这两个动态库在创建时都包含了静态库liba

打静态库所出现的问题以及解决方法

1.静态库中包含了Category(分类) 如果静态库中包含了Category,有时候在使用静态库的工程中会报“方法找不到”的错误(unrecognized selector sent to instance) 解决方案:在使用静态库的工程中配置Other Linker Flags为-ObjC 2.IOS编译报错:objc-class-ref in AppDelegate.o之解决方案 |2015-01-23 09:50 |14695人阅读 xcode6.0升级到xcode6.1后,程序编译报错

iOS 元件组件-创建静态库static library

概述 在项目开发的过程中,经常使用静态库文件.例如两个公司之间业务交流,不可能把源代码都发送给另一个公司,这时候将私密内容打包成静态库,别人只能调用接口,而不能知道其中实现的细节. 库是一些没有main函数的程序代码集合.除了静态库,还有动态链接库,他们之间的区别是:静态库可以编译到我们的执行代码中,应用程序可以在没有静态库的环境中运行:动态库不能编译到我们的执行代码中,应用程序必须在有链接库文件的环境下运行.另外,动态库在AppStore里,很有可能被拒绝,上架不了. 因而,一般情况下,我们都

浅析静态库链接原理

静态库的链接基本上同链接目标文件.obj/.o相同,但也有些不同的地方.本文简要描述linux下静态库在链接过程中的一些细节. 静态库文件格式 静态库远远不同于动态库,不涉及到符号重定位之类的问题.静态库本质上只是将一堆目标文件进行打包而已.静态库没有标准,不同的linux下都会有些细微的差别.大致的格式wiki上描述的较清楚: Global header ----------------- +------------------------------- File header 1 --->

[IOS] 静态库项目之间的相互引用

公司有不同的SDK,SDK之间也是相互引用,很多为了省事直接打包静态库发布 这就需要 静态库 之间相互引用,被引用的项目 为 DestationKit ,项目为 SourceKit 在Xcode6.1 下直接将 DestationKit 项目拖到 SourceKit 的项目中即可,不要拖到项目 的文件中去,添加搜索路径,为了方便管理项目直接将DestationKit 项目放在SourceKit 的项目下,详情如图 拖项目: 文件件结构: 搜索路径设置: "${SRCROOT}/../Destat

CMake和静态库顺序

目录 目录 1 前言 1 方法 1 附1:链接静态库的顺序问题 2 附2:再议GCC编译时的静态库依赖次顺问题 3 附3:gcc链接参数--whole-archive的作用 4 附4:让有些"-l"链接静态库,而另一些链接共享库? 6 附5:相关博文 6 前言 C/C++程序的许多同学被静态库的依赖折腾,因为默认情况下要求被依赖的库放在依赖它的库后面,当一个程序或共享库依赖的静态库较多时,可能会陷入解决链接问题的坑中.如果对静态库不熟悉,需要结构nm等工具来解决顺序问题. 但也可以偷懒

vc6.0里使用lib(静态库)的方法

vc6.0 中使用lib文件 使用库的方法如下: 1. 包含库的头文件(把库的头文件包含到项目中) 在应用程序工程中使用 #include "file path" file path可以为绝对路径,也可以为相对于工程所在目录的相对路径 如果头文件比较多,可以在project>settings>c/c++>preprocessor的Additional include directories中填入你的头文件所在目录 2. 导入lib库.导入的方法很多 方法1) 直接用p

(一〇一)集成静态库RHAddressBook实现OC访问通讯录

使用官方的AddressBook框架仅能使用C语言访问通讯录,十分不便,这里介绍集成第三方框架RHAddressBook的方法,该框架可以通过OC访问和操作通讯录. 该框架是一个静态库,集成比较复杂. 首先下载该框架:RHAddressBook,下面有关于集成的一些介绍,下面简单的介绍一下集成的过程. ①首先把静态库工程直接拖入自己的工程: ②选中自己的工程,工程配置中选择Build Phases,按照下图导入两个文件,点击左侧的加号添加即可. ③选择Build Settings,搜索Heade

静态库制作-混编(工程是oc为基础)

最近工作需要,需要制作一些静态库.由于缺乏经验,特意找了一些资料,加上自己的测试.特意在此记录一些心得和踩过的坑.所谓“好记性不如烂笔头”,希望自己以后忘记的时候能回头来看看,同时也希望对后来者能提供一定的帮助. 这里,我只写对我来说是难点的地方. 首先,framework是静态库.是用oc编写的.如果静态库制作好了,没问题的话,无论是放到oc项目还是swift项目,都不应该有问题.其中,swift与oc互调也不会有问题.难点在于,在编写framework的时候,如果framework本身是混编