SDK開發:SDK之間相互依賴,文件加載不完全問題(項目中NSClassFromString方法找不到文件)

起初在做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文件,得到方法如下:
圖1

在工程的targets下,給other linker flags加一個字段,-all_load。
于是問題就瞬間解決了,真是輕松加愉快!!!

感謝奮斗的小黃鳥的回復

第二個方法---給other linker flags加一個字段-ObjC也是可以的

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容