我有一个NSLocalizedStringFromTableInBundle
通常有效的调用,所以我知道它具有正确的键、表和包名称参数。但是,在应用程序中执行了另一个看似无关的操作 X,并且进行了相同的“来自捆绑的字符串”调用,我得到了崩溃。堆栈跟踪仅显示[NSBundle localizedStringForKey:value:table:]
.
*** -[CFDictionary objectForKey:]: message sent to deallocated instance 0x4e6f2d0
我使用了 Instruments,它直到崩溃本身并没有显示任何异常,它确实找到了一个僵尸。
1 0x7a2f840 CFDictionary(可变)僵尸-1 00:51.528.884 0 基础-[NSBundle _initInfoDictionary]
我尝试过的其他事情包括替换宏调用以使用[NSBundle bundleWithIdentifier:
. 同样,这一直有效,直到完成其他操作 X,然后发生同样的崩溃,尽管在这种情况下,它是在我添加的加载调用上。
if (![bundle isLoaded])
[bundle load];
虽然你已经可以知道它在那个时候不起作用,因为通常捆绑包的描述是有效的(NSBundle </Users/...blah...framework> (loaded)
),但是当它不起作用时,它看起来像这样:
(NSBundle *) $3 = 0x0613f020 NSBundle <(null)> (not yet loaded)
显而易见的答案是操作 X 做了一些坏事,但我看不到它会做的任何事情,除了使用它自己的一些自动释放池(在 10.8 上)。即使我将它们注释掉,它也会失败。而且,假设我那里的代码很糟糕,我怎么能以这种非常特殊的方式弄乱 NSBundle 的内部初始化或加载,使其无法用于本地化?
有没有人见过类似的东西?我真的希望它是我做错的事情,而不仅仅是 10.8 上的问题(顺便说一句,10.6 上不会发生)。