我打电话给NSLocalizedStringFromTableInBundle
这通常有效,所以我知道它有正确的键,表和&参数。捆绑名称。然而,接下来,在应用程序中完成了看似无关的操作X,并且进行了相同的“来自bundle的字符串”调用,我崩溃了。堆栈跟踪仅显示[NSBundle localizedStringForKey:value:table:]
。
*** -[CFDictionary objectForKey:]: message sent to deallocated instance 0x4e6f2d0
我使用了仪器,它直到撞击本身才显示出任何异常,它确实发现了一个僵尸。
1 0x7a2f840 CFDictionary(mutable)Zombie -1 00:51.528.884 0 Foundation - [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,顺便说一下)。