iOS動態庫的開發

在XCode6纔開始支持開發framework,即支持動態庫的開發。對於動態庫,做個c++的同學應該瞭解dll,framework的動態庫的形式就跟all一樣的,可以在運行過程中加載到內存中。

framework的動態庫,有兩種方式可以動態加載到內存中:
1、 通過NSBundle類來加載
加載代碼

libbundle = [NSBundle bundleWithPath:destLibPath];
if ([_libbundle loadAndReturnError:&err]) {
//
}

卸載代碼
[_libbundle unload];
_libbundle = nil;

注意:這種方式,我測試過unload是卸載不了的,估計是蘋果公司的bug。不過目前我沒有測過,是不是已經修復了。

2、 通過ios的提供的C++接口加載

加載代碼
lib_handle = dlopen(cPath, RTLD_LAZY);
char *error = dlerror();

卸載代碼
int ret = dlclose(lib_handle);
ret = dlclose(lib_handle);
lib_handle = NULL;

經過測試dlclose接口卸載動態庫,需要調用兩次。在stackoverflow論壇上有很多關於dlclose卸載不了動態庫的提問,其中:
http://stackoverflow.com/questions/8793099/unload-dynamic-library-needs-two-dlclose-calls

3、 如果實現在線升級插件

1)工程裏導入動態庫中定義好.h文件
oc編譯連接的時候,只需要.h文件就可以成功編譯連接。基於此,我們可以把動態庫的.h文件導入到工程裏,就可以編譯app代碼;

這種方式就是一個缺點:工程代碼跟動態庫耦合起來了,而且如果動態庫.h增加了API就需要做版本兼容。

2)定義入口API協議方式
動態庫中,如果會有自己的UI邏輯,APP調用這個動態庫的時候,需要根據協議的方式去調用。讓動態庫的入口類需要實現入口協議。通過後臺服務接口告知動態庫的入口類的類名,運用oc的運行時就可以加載這個類。

4、 其他一些在線升級的研究
有興趣可以去研究一下lua腳本。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章