在1个类的NSNotificationCenter中添加2个具有一个名称的观察者

时间:2012-01-23 13:10:32

标签: objective-c nsnotificationcenter

我的应用程序中存在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。

感谢。

1 个答案:

答案 0 :(得分:1)

拥有相同通知的多个观察者没有问题。您描述的问题听起来很像是与观察者的生命周期有关。

如果您取消分配仍在注册的对象以收听通知,NSNotificationCenter并不知道。如果将来有通知,中心会将其转发给它认为仍在侦听的对象(但已经消失),然后你就会崩溃。

此问题的解决方案是确保在销毁对象之前将其作为观察者移除。有两种方法可以做到这一点:

  • 通常您会知道某个对象何时应该开始或停止收听通知,并且您可以确保在它应该停止时将其作为观察者删除(例如,视图控制器应该开始监听模型更新时当他们的观点消失时,他们的观点会出现并停止倾听。)
  • 其他时候,一个对象可以管理自己的通知生命周期:也许你可以开始在初始化中收听并停止在-dealloc中收听。

无论你采用何种方式,你都需要平衡添加观察者和移除观察者,以便当一个物体消失时它不再在通知中心注册。