如何卸载 NSBundle?

Posted

技术标签:

【中文标题】如何卸载 NSBundle?【英文标题】:How can I unload NSBundle? 【发布时间】:2015-08-14 04:37:37 【问题描述】:

我有一个需要从服务器下载本地化文件的场景。我在应用程序开始时下载文件并将其存储在捆绑包中的文件夹中。就像它的英文文件一样,我将它存储在文件夹 'en.lproj' 下,名称为 Localizable.strings

现在下载文件时,我使用 bundleWithPath: 方法加载包。 加载后,我会使用方法显示本地化

NSLocalizedStringFromTableInBundle(key, @"Localizable", bundle, @"");

到这里它工作正常。 现在,如果从服务器更新文件,我将再次下载英文文件并将旧文件替换为新文件。 但是该应用程序显示了被替换的旧文件的本地化。 谁能告诉我我们是否可以重新加载捆绑包以反映更新。

在上述情况下,更新文件时不会终止应用程序。 如果我终止应用程序并重新启动它,那么更改就会反映。 但我希望在不终止应用程序的情况下反映更改。

有没有办法卸载加载的NSBundle?

【问题讨论】:

在真正的 ios 设备上,您无法更新应用程序包 - 它是只读的。 @rmaddy:它不是主要的捆绑包。我正在创建一个新包。所以我们无论如何都可以通过编码来改变它。 【参考方案1】:

得到答案..

这段代码有帮助。这用于从缓存中刷新加载的包。

BOOL FlushBundleCache(NSBundle *prefBundle) 
    // Before calling the function, we need to check if it exists
    // since it was weak-linked.
    if (_CFBundleFlushBundleCaches != NULL) 
        NSLog(@"Flushing bundle cache with _CFBundleFlushBundleCaches");
        CFBundleRef cfBundle =
        CFBundleCreate(nil, (CFURLRef)[prefBundle bundleURL]);
        _CFBundleFlushBundleCaches(cfBundle);
        CFRelease(cfBundle);
        return YES; // Success
    
    return NO; // Not available

【讨论】:

_CFBundleFlushBundleCaches 是一个私有 API。如果您尝试将应用提交到 App Store,您的应用将被 Apple 拒绝。 @DavidCheung:谢谢大卫。是的,我后来发现了。我的应用被拒绝了。我将我的方法从使用 bundle 更改为使用静态 NSDictionary。这对我有帮助。谢谢 你能发布一个更完整的答案吗?谢谢。

以上是关于如何卸载 NSBundle?的主要内容,如果未能解决你的问题,请参考以下文章

如何卸载安装的xampp软件

linux如何卸载conda

如何完全卸载VMware

Revit如何利用官方卸载工具正确卸载干净?

如何彻底卸载vs2017

virbr0虚拟网卡如何卸载