起初在做SDK開發(fā)的時(shí)候造垛,都是單個(gè)SDK,一套邏輯走完晰搀,生成的SDK用起來完全沒有問題五辽,今天在接手公司上一個(gè)復(fù)雜SDK項(xiàng)目的時(shí)候,牽扯到了SDK之間的聯(lián)系外恕,直接導(dǎo)入工程中之后杆逗,在一個(gè)SDK文件中加載另一個(gè)的時(shí)候,總是找不到文件鳞疲,具體如下:
static RoRoSDKInterface *roroSDKInterface;
+ (RoRoSDKInterface *)getInstance {
if (roroSDKInterface == nil){
Class c = NSClassFromString(@"RoRoFunction");
roroSDKInterface = [[c alloc] init];
}
return roroSDKInterface;
}
如文所見罪郊,此方法是個(gè)單例類,是在一個(gè)SDK中的文件尚洽,這里想用NSClassFromString這個(gè)方法映射悔橄,創(chuàng)建一個(gè)RoRoFunction類,但問題就出在這:RoRoFunction這個(gè)文件是在另一個(gè)SDK文件中的腺毫,如此一來癣疟,在創(chuàng)建的時(shí)候,這個(gè)Class總是為nil潮酒,百思不得姐睛挚,google吧。
得解如此:
NSClassFromString是一個(gè)很有用的東西急黎,尤其在進(jìn)行iPhone toolchain的開發(fā)上扎狱。正常來說侧到,
id myObj = [[NSClassFromString(@"MySpecialClass") alloc] init];
和
id myObj = [[MySpecialClass alloc] init];
是一樣的。但是淤击,如果你的程序中并不存在MySpecialClass這個(gè)類床牧,下面的寫法會(huì)出錯(cuò),而上面的寫法只是返回一個(gè)空對(duì)象而已遭贸。
因此戈咳,在某些情況下,可以使用NSClassFromString來進(jìn)行你不確定的類的初始化壕吹。
NSClassFromString的好處是:
1 弱化連接著蛙,因此并不會(huì)把沒有的Framework也link到程序中。
2 不需要使用import耳贬,因?yàn)轭愂莿?dòng)態(tài)加載的踏堡,只要存在就可以加載。因此如果你的toolchain中沒有某個(gè)類的頭文件定義咒劲,而你確信這個(gè)類是可以用的顷蟆,那么也可以用這種方法。
那么應(yīng)該是這樣的:既然是可以返回nil腐魂,二我的工程中單例也返回nil帐偎,原因可能是工程中沒有成功導(dǎo)入"RoRoFunction"這個(gè)類,于是驗(yàn)證:
--- 在viewController中導(dǎo)入#import <roro_yk/RoRoFunction.h> 沒有問題蛔屹,這個(gè)我工程中的頭文件削樊,大家可以不用在意;
--- 在viewDidLoad中也能寫出如下代碼:
[[RoRoFunction alloc] init];
那么就不是沒有導(dǎo)入這個(gè)類的原因了兔毒。
那么我想既然是工程中有文件漫贞,有沒有可能是在調(diào)用方法的時(shí)候還沒有加載完成呢,于是我百度如何加載framework文件育叁,得到方法如下:
在工程的targets下迅脐,給other linker flags加一個(gè)字段,-all_load豪嗽。
于是問題就瞬間解決了谴蔑,真是輕松加愉快!j侵琛树碱!
感謝奮斗的小黃鳥的回復(fù)
第二個(gè)方法---給other linker flags加一個(gè)字段-ObjC也是可以的