Post of NSNotificationCenter causing "EXC_BAD_ACCESS" exception
A UIViewController
adds itself to the default center:
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(editFood)
name:@"editFood"
objec开发者_开发技巧t:nil];
Then a UITableView
delegate NSObject posts a NSNotification
:
[[NSNotificationCenter defaultCenter]
postNotificationName:@"editFood"
object:self];
During run time it get a EXC_BAD_ACCESS exception.
Is the defaultCenter
getting released somewhere? The same concept works when I post a notification to a UIViewController from a UIViewController, but that shouldn't matter, right?
One of your subscribers has been deallocated. Make sure to call [[NSNotificationCenter defaultCenter] removeObserver:self]
in your dealloc (if not sooner).
EXC_BAD_ACCESS
can happen even after verifying dealloc exists like so:
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self]
}
The above will solve the problem most of the time, but apparently my cause was that I was indirectly adding the observer with a selector:
set to nil
as follows:
[NSNotificationCenter.defaultCenter addObserver:self
selector:nil
name:notificationName
object:nil];
...so when I posted something with that notificationName
, EXC_BAD_ACCESS
occurred.
The solution was to send a selector that actually points to something.
I had the same issue in Swift. The problem was the function target had a closure
parameter with default value:
@objc func performFoo(completion: (() -> Void)? = nil) {
...
}
After I replace the closure
parameter with a Notification
parameter, it worked:
@objc func performFoo(notification: Notification) {
...
}
I had to make some refactor to make it works in a right way.
精彩评论