起初在做SDK开发的时候,都是单个SDK,一套逻辑走完,生成的SDK用起来完全没有问题,今天在接手公司上一个复杂SDK项目的时候,牵扯到了SDK之间的联系,直接导入工程中之后,在一个SDK文件中加载另一个的时候,总是找不到文件,具体如下:
static RoRoSDKInterface *roroSDKInterface;
+ (RoRoSDKInterface *)getInstance {
if (roroSDKInterface == nil){
Class c = NSClassFromString(@"RoRoFunction");
roroSDKInterface = [[c alloc] init];
}
return roroSDKInterface;
}
如文所见,此方法是个单例类,是在一个SDK中的文件,这里想用NSClassFromString这个方法映射,创建一个RoRoFunction类,但问题就出在这:RoRoFunction这个文件是在另一个SDK文件中的,如此一来,在创建的时候,这个Class总是为nil,百思不得姐,google吧。
得解如此:
NSClassFromString是一个很有用的东西,尤其在进行iPhone toolchain的开发上。正常来说,
id myObj = [[NSClassFromString(@"MySpecialClass") alloc] init];
和
id myObj = [[MySpecialClass alloc] init];
是一样的。但是,如果你的程序中并不存在MySpecialClass这个类,下面的写法会出错,而上面的写法只是返回一个空对象而已。
因此,在某些情况下,可以使用NSClassFromString来进行你不确定的类的初始化。
NSClassFromString的好处是:
1 弱化连接,因此并不会把没有的Framework也link到程序中。
2 不需要使用import,因为类是动态加载的,只要存在就可以加载。因此如果你的toolchain中没有某个类的头文件定义,而你确信这个类是可以用的,那么也可以用这种方法。
那么应该是这样的:既然是可以返回nil,二我的工程中单例也返回nil,原因可能是工程中没有成功导入"RoRoFunction"这个类,于是验证:
--- 在viewController中导入#import <roro_yk/RoRoFunction.h> 没有问题,这个我工程中的头文件,大家可以不用在意;
--- 在viewDidLoad中也能写出如下代码:
[[RoRoFunction alloc] init];
那么就不是没有导入这个类的原因了。
那么我想既然是工程中有文件,有没有可能是在调用方法的时候还没有加载完成呢,于是我百度如何加载framework文件,得到方法如下:
在工程的targets下,给other linker flags加一个字段,-all_load。
于是问题就瞬间解决了,真是轻松加愉快!!!
感谢奋斗的小黄鸟的回复
第二个方法---给other linker flags加一个字段-ObjC也是可以的