我对 Objective-C 中的块仍然很陌生,想知道我的伪代码是否正确。我不确定仅删除观察者是否足够,或者是否必须调用removeObserver:name:object:
-(void) scan {
Scanner *scanner = [[Scanner alloc] init];
id scanComplete = [[NSNotificationCenter defaultCenter] addObserverForName:@"ScanComplete"
object:scanner
queue:nil
usingBlock:^(NSNotification *notification){
/*
do something
*/
[[NSNotificationCenter defaultCenter] removeObserver:scanComplete];
[scanner release];
}];
[scanner startScan];
}
更新:我收到间歇性的EXC_BAD_ACCESS
从这个街区开始,所以这是不对的。
声明scanComplete
定义块本身之前的变量。
您需要这样做的原因是因为您试图访问定义时块内不存在的变量,因为该变量本身尚未分配。
What is EXC_BAD_ACCESS
?嗯,这是当您尝试访问不存在的引用时引发的异常。所以这正是你的例子中的情况。
因此,如果您在块本身之前声明变量,那么它应该可以工作:
-(void) scan {
Scanner *scanner = [[Scanner alloc] init];
__block id scanComplete;
scanComplete = [[NSNotificationCenter defaultCenter] addObserverForName:@"ScanComplete"
object:scanner
queue:nil
usingBlock:^(NSNotification *notification){
/*
do something
*/
[[NSNotificationCenter defaultCenter] removeObserver:scanComplete];
[scanner release];
}];
[scanner startScan];
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)