静态库部分代码未被连接解决方案
2015-06-15 10:35
281 查看
问题1
静态库打包时,经常会碰到send undefined select to instance。这种问题尝尝出在使用catagory扩展的方法中。分析问题是怎么发生的:
因为catagory是运行时才回去检索符号表去寻找方法IMP。而在编译时,编译器并没有检测到有关联关系,因此在宿主APP在编译链接时,将catagory误认为没有用到的文件而没有连接进二进制码中去。
解决办法如下:
1、将所有的catagory改写为Helper类,将catagory扩展的方法改为类方法。
2、宿主APP在编译时添加force load/all load 参数。
方法1是对SDK接入方友好的做法,不需要接入方做什么额外的操作就可以使用,推荐使用。
问题2
打好的SDK包由两个部分组成,1、Framework包裹的.a文件和头文件。
2、由图片资源,nib资源等组成的Bundle文件。
在测试宿主APP的时候,出现如下 “Unknown class <MyClass> in Interface Builder file” 这样的错误提示。
仔细检查SDK的Bundle资源包中的xib文件,发现在xib中使用了某些自定义的class,但是在项目中并没有直接调用该类(因为某些场景中并不需要)。
分析问题是怎么发生的:
nib加载class是在运行时发生的,而不是在编译时决定。这使得linker在连接时将这个class当成没有被调用的废弃类而『自作聪明』的优化掉了。
而nib在运行时加载时,通过class的字串来反射加载相应的class时找不到对应的class,于是发出警告。
解决办法如下:
知道问题是怎么发生的,问题的解决思路就很清晰了。
在sdk中假装使用一次该类。
举个例子:
我们在MyClass中写一个空方法
+(void)forceLoad{};
在其他类中写一个永远不会被调用的方法:
+(void)forceLoadClass{
[MyClass1 forceLoad];
[MyClass2 forceLoad];
[MyClass3 forceLoad];
}
Well done!通过这种方法可以强制linker在链接时链接这些之前被误优化掉的类。
相关文章推荐
- Android ADT 23.0.0无法更新到23.0.2问题解决方案
- Patrol 7 架构下?的处理方法
- SDKMAN:轻松管理多个软件开发套件 (SDK) 的命令行工具
- 中病毒后常用的解决方法病毒终极解决方案
- 修复mysql数据库
- QQ尾巴 InfoMs.Ime 解决方案
- Enterprise Library for .NET Framework 2.0缓存使用实例
- C# Entity Framework中的IQueryable和IQueryProvider详解
- 由vbs sort引发.NET Framework之间的关系说明
- IE对CSS样式表的限制分析与解决方案
- C#难点逐个击破(6):C#数据类型与.net framework数据类型
- 开源MySQL高效数据仓库解决方案:Infobright详细介绍
- nodejs中的fiber(纤程)库详解
- Parse正式发布开源PHP SDK
- 桌面中心(一)创建数据库
- zend framework框架中url大小写问题解决方法
- Yii PHP Framework实用入门教程(详细介绍)
- 微软NET Framework 3.5 Beta 1 发布 提供下载
- 使用Entity Framework(4.3.1版本)遇到的问题整理
- 惊现支撑1亿pv/天的超级数据库解决方案