起初在做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也是可以的