gpt4 book ai didi

ios - 设置 isFinished 时取消 NSOperation EXC_BAD_ACCESS 崩溃

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:37:01 27 4
gpt4 key购买 nike

我有一个 NSOperation 子类,它从 UITableView 运行异步操作。

我像这样覆盖正确的开始和结束方法:

- (void)start
{
[self willChangeValueForKey:@"isExecuting"];
self.isExecuting = YES;
[self didChangeValueForKey:@"isExecuting"];

if (self.isCancelled)
{
[self finish];
return;
}
}
- (void)finish
{
if (!_isExecuting)
{
[self willChangeValueForKey:@"isExecuting"];
_isExecuting = YES;
[self didChangeValueForKey:@"isExecuting"];
}

[self willChangeValueForKey:@"isExecuting"];
[self willChangeValueForKey:@"isFinished"];

_isExecuting = NO;
_isFinished = YES;

[self didChangeValueForKey:@"isExecuting"];
[self didChangeValueForKey:@"isFinished"];
}

我遇到的问题是,如果我向下滚动表格并删除一行,这将调用操作的 cancel 方法,但是随着操作逐渐完成并且它到达表格的更下方,它因 [self didChangeValueForKey:@"isFinished"];

行上的 EXC_BAD_ACCESS 错误而崩溃

代码非常复杂,无法将其全部粘贴到此处,但我想知道的是如何找到导致 KVO 消息崩溃的对象?

如果我在调试器中启用僵尸对象,它根本不会崩溃,也不会出现无济于事的警告。

如果我将 KVO 方法包装在 try/catch 中,它永远不会被捕获并且仍然会崩溃。

我已经尝试覆盖我的 NSOperation 子类中的 KVO 方法,但它们从未被调用过:

- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context
{
NSLog(@"%s - %@", __PRETTY_FUNCTION__, observer);
[super addObserver:observer forKeyPath:keyPath options:options context:context];
}

是否可以看到观察者是谁?

最佳答案

评论和想法:

  1. startself.isExecuting = YES 不应该是 _isExecuting = YES; 吗?
  2. 添加一个名为 identifier 的 NSString 类型的属性,并为每个操作设置它。
  3. 添加一个dealloc 方法并记录identifier
  4. finish 中测试 isCancelled,如果是则立即返回。

另一个想法是双重保留操作 - 将它们放入一个以 identifier 为键的 NSDictionary 中,然后查看是否有任何变化。

关于ios - 设置 isFinished 时取消 NSOperation EXC_BAD_ACCESS 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35037100/

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