在将NSNotification发布到 - [NSNotificationCenter addObserverForName:...]时,是否有任何与EXC_BAD_ACCESS随机崩溃的解决方法

时间:2013-11-07 10:15:24

标签: objective-c multithreading exc-bad-access nsnotificationcenter

我们在课堂上观察通知 - [NSNotificationCenter addObserverForName:object:queue:usingBlock:]但是随着EXC_BAD_ACCESS随机崩溃。

@interface Test: NSObject {
  id obs; 
}

@end


@implementation Test
- (id)init {

  self = [super init];

  if (self) {

    Test * __weak weakSelf = self;

    self->obs = [[NSNotificationCenter defaultCenter] addObserverForName:Notification object:nil queue:nil usingBlock:^(NSNotification *note) {

           Test *strongSelf = weakSelf;

           if (!strongSelf) {

            return;

          }



      [strongSelf handleNotification:note];

    }];
  }

  return self;
}

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self->obs];

      self->obs = nil;
}    

@end

我们发现,有时当发布通知时,NSNotificationCenter已经获得观察者并准备调用该块通知但同时,该对象被解除分配,因此使用self-gt; obs,这使得它成为可能由于zombie self-> obs

而导致[NSNotification postNotification ...]方法崩溃

是否有解决方法或修复此问题?

PS。这是ARC代码。

1 个答案:

答案 0 :(得分:0)

  

是否存在随机崩溃的解决方法?

Enable zombies - 这会导致违规行的断点异常。从那里开始,比一般的EXC_BAD_ACCESS崩溃要容易得多。