KVO/KVC在重新加载之前卸载的捆绑包时崩溃
问题描述:
我遇到了与可加载捆绑包和KVO有关的问题。似乎任何有KVO观察者附加到它的实例的类都不能通过NSBundle的-unload
方法安全地卸载。KVO/KVC在重新加载之前卸载的捆绑包时崩溃
我做了以下内容:
for (int i = 0; i < 100; i++)
{
[bundle load];
Class bundleClass = [bundle principalClass];
[[[bundleClass alloc] init] release];
[bundle unload];
}
而在捆绑的原理类-init
方法,
[self addObserver: self
forKeyPath: @"name"
options: 0
context: nil];
self.name = @"jim";
环路获得通过迭代的次数,有时绕第二圈时崩溃有时候在三十号。
使用EXC_BAD_ACCESS信号时,它总是与此回溯相碰撞。
#0 0x00007fff8a30deab in objc_msgSend()
#1 0x00007fff8609d862 in NSKeyValueNotifyObserver()
#2 0x00007fff860be99b in NSKeyValueDidChange()
#3 0x00007fff8606b0fb in -[NSObject(NSKeyValueObserverNotification) didChangeValueForKey:]()
#4 0x00000001007a4c2c in -[Bundle init] (self=0x101902130, _cmd=0x7fff8ea369b0) at /Users/joerick/Desktop/bundleTest/testbundle/Bundle.m:26
#5 0x0000000100001731 in -[SIAppDelegate applicationDidFinishLaunching:] (self=0x100326a90, _cmd=0x7fff876e285f, aNotification=0x100131ea0) at /Users/joerick/Desktop/bundleTest/bundleTest/SIAppDelegate.m:28
#6 0x00007fff8606ade2 in __-[NSNotificationCenter addObserver:selector:name:object:]_block_invoke_1()
#7 0x00007fff8b470e0a in _CFXNotificationPost()
#8 0x00007fff86057097 in -[NSNotificationCenter postNotificationName:object:userInfo:]()
#9 0x00007fff8e1bbaa7 in -[NSApplication _postDidFinishNotification]()
#10 0x00007fff8e1bb80d in -[NSApplication _sendFinishLaunchingNotification]()
....
您可以下载显示这个问题here一个样本项目。
我在想这是可可中的一个错误,但我想知道是否有人能看到我是否在这里做什么愚蠢的事情?