2016-08-23 10 views
0

申し訳ありませんが、私は英語が貧弱ですが、私は質問を明確に記述します。私はダウンロード動的なフレームワークを実装し、私たちの「社内」アプリケーションでそれをロードしようとしています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を使用しますこれを行う必要があるのは、私たちが新しい更新プログラムを持っている場合、私たちのアプリケーションを常に公開しないようにしたいからです。

+0

私はリンゴがこのようにiOS 10以降の動的なフレームワークを読み込むのをブロックすると思います。悲しいことに:( –

答えて

0

おそらく、フレームワークでARCを使用しないでください。

私はあなたがそれを殺すまで、アプリケーションはまだフレームワークを読み込むと思います。

関連する問題