申し訳ありませんが、私は英語が貧弱ですが、私は質問を明確に記述します。私はダウンロード動的なフレームワークを実装し、私たちの「社内」アプリケーションでそれをロードしようとしていますNSBundleは動的フレームワークをアンロードできません
。(社内アプリの、私たちは、AppStore気にしないので。)(このarticleを参照)
ダウンロードし、負荷と動的フレームワークを使用しても問題ありません!それはうまく動作します。
しかし、アンロードして新しいダイナミックフレームワークをダウンロードしようとすると(同じフレームワーク名ではあるが内部クラスが異なる)、ロードする前にすべての古いフレームワークがアンロードされ、削除されます。クラス。
アンロードフレームワークコード:
NSBundle *bundle = [NSBundle bundleWithPath:documentsPath];
result = [bundle unload]; // I use break point, it says unload MyFramework.framework.
[self removeBundleAndZip]; // It's just a function to remove bundle files.
しかし、それはまだクラスを使用することができます。私はクラスがdeallocであることを確信しています(クラスdeallocのときに出力します)。そして私は、このクラスをキャッシュする目的はCランタイムだと思います。
だから私は別の記事(How to remove NSBundle cache)を見つけて、私はそのようにそれを追加します。
NSBundle *bundle = [NSBundle bundleWithPath:documentsPath];
result = [bundle unload]; // I use break point, it says unload MyFramework.framework.
if (FlushBundleCache(bundle)) {
NSLog(@" ** Success: flush bundle cache SUCCESS ...");
}
else{
NSLog(@" ** Faile: flush bundle cache FAIL! ");
}
[self removeBundleAndZip]; // It's just a function to remove bundle files.
フラッシュ成功それでもアンロード古い後に新しいフレームワークをロードして使用することはできません。 (ロードは大丈夫ですが、フレームワークの古いクラスではありませんが、アプリケーションを再起動すると新しいフレームワークが使用されます)。
アンロードする方法はありますか古いフレームワークを読み込んで新しいものを読み込みますが、アプリケーションを再起動しませんか?
PS:私たち:ここに私のロードフレームワークのコードがある...
NSString *documentsPath = [NSString stringWithFormat:@"%@/Documents/%@/%@",NSHomeDirectory() , @"frameworkFolder" , @"myDownloadFramework.framework"];
if ([[NSFileManager defaultManager] fileExistsAtPath:documentsPath]) {
NSError *error = nil;
NSBundle *bundle = [NSBundle bundleWithPath:documentsPath];
if ([bundle loadAndReturnError:&error]) {
if (error) {
NSLog(@"Fail: NSBundle load framework fail.(%@)" , error.description);
}
else{
NSLog(@"Success: NSBundle load framework success!");
result = YES;
}
}
else{
NSLog(@"Fail: NSBundle load framework fail.");
}
}
else{
NSLog(@"Fail: NSBundle load framework fail.(file not exist)");
}
は、ダウンロードフレームワークである私のクラス
Class myClass = objc_getClass("MyClassInFramework");
使用クラスメソッド
SEL myMethod = @selector(myMethodInClass);
if([myClass responseToSelector:myMethod]){
objc_msgSend(myClass , myMethod , nil);
}
PSを使用しますこれを行う必要があるのは、私たちが新しい更新プログラムを持っている場合、私たちのアプリケーションを常に公開しないようにしたいからです。
私はリンゴがこのようにiOS 10以降の動的なフレームワークを読み込むのをブロックすると思います。悲しいことに:( –