您的位置:首页 > 编程语言

静态库部分代码未被连接解决方案

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在链接时链接这些之前被误优化掉的类。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息