我的应用程序中存在NSNotificationCenter的观察者问题。
我的AppDelegate类有2个服务类来通过url获取数据,这个数据名为ExhibitionService& NewsService。
这2个服务类本身使用一个Queueloader类。
当我在appdelegate类中编写2个观察者来监听服务加载操作时,它会返回错误并崩溃。
APP DELEGATE CLASS
ExhibitionLoaderService *exhibitionService = [[ExhibitionLoaderService alloc] init];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(exhitibionServiceComplete :) name:**CserviceComplete** object:nil];
[exhibitionService load];
NewsLoaderService *newsService = [[NewsLoaderService alloc] init];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(newsServiceComplete :) name:**CserviceComplete** object:nil];
[newsService load];
ExhibitionLoaderService.m& NewsLoaderService具有相同的方法
-(void)load
{
Queueloader *que = [[Queueloader alloc] initWithPath:CExhibitionURLPath isVerbose:NO];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didQueComplete:) name:CdidQueueloaderComplete object:nil];
[que startOperation];
[que release];
}
错误我GOT
[[NSNotificationCenter defaultCenter] postNotificationName:**CdidQueueloaderComplete** object:results];
2服务类有CdidQueueloaderComplete ...问题是关于观察者但是如何?什么?
PS。程序接收信号EXC_BAD_ACCESS。
感谢。
答案 0 :(得分:1)
拥有相同通知的多个观察者没有问题。您描述的问题听起来很像是与观察者的生命周期有关。
如果您取消分配仍在注册的对象以收听通知,NSNotificationCenter
并不知道。如果将来有通知,中心会将其转发给它认为仍在侦听的对象(但已经消失),然后你就会崩溃。
此问题的解决方案是确保在销毁对象之前将其作为观察者移除。有两种方法可以做到这一点:
-dealloc
中收听。无论你采用何种方式,你都需要平衡添加观察者和移除观察者,以便当一个物体消失时它不再在通知中心注册。