gpt4 book ai didi

ios - 正确管理addObserverForName :object:queue:usingBlock:

转载 作者:IT王子 更新时间:2023-10-29 07:51:15 26 4
gpt4 key购买 nike

我对 objective-c 中的 block 还是个新手,想知道我的伪代码是否正确。我不确定只删除观察者是否足够,或者我是否必须调用 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];
}

更新:我从这个 block 收到间歇性的 EXC_BAD_ACCESS,所以这不可能是正确的。

最佳答案

在定义 block 本身之前声明 scanComplete 变量。

您需要这样做的原因是因为您试图访问定义时 block 中不存在的变量,因为变量本身尚未分配。

什么是EXC_BAD_ACCESS?好吧,这是当您尝试访问不存在的引用时抛出的异常。所以这正是您的示例中的情况。

因此,如果您在 block 本身之前声明变量,那么它应该可以工作:

-(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];
}

关于ios - 正确管理addObserverForName :object:queue:usingBlock:,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4550798/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com