gpt4 book ai didi

iphone - 使用某些类型的方法删除对象时出现 NSMutableArray 错误

转载 作者:行者123 更新时间:2023-11-28 20:22:36 24 4
gpt4 key购买 nike

我有一个 UIImageViewsNSMutableArray,我不断对其进行迭代(使用 CADisplayLink)。我这样做是为了在屏幕上连续移动 UIImageViews

当我从数组中删除 UIImageView 时,有时会出现错误:

EXC_BAD_ACCESS (code=1, address=0x20000008)

然而,在我开始使用 ARC/iOS6 之前,我过去经常遇到错误“Array was mutated while being enumerated”,所以我认为这两个错误的意思完全相同,但我不确定。

无论如何,这是我的问题。使用以下任何方法从数组中删除 UIImageView 都会出现上述错误。

[imageViews removeObject:imageView];

[imageViews performSelector:@selector(removeObject:) withObject:imageView];

[imageViews performSelectorOnMainThread:@selector(removeObject:) withObject:imageView waitUntilDone:YES];

但是,使用下面的任何方法从不都会给我错误。

[imageViews performSelectorOnMainThread:@selector(removeObject:) withObject:imageView waitUntilDone:NO];

[imageViews performSelector:@selector(removeObject:) withObject:imageView afterDelay:.01];

那么有人可以向我解释为什么使用上面列出的第一组方法从 NSMutableArray 中删除对象会给我一个我认为是“数组在枚举时发生突变”的错误,同时使用第二组方法永远不会给我那个错误?

我一直在使用上面列出的第二组方法来解决这个错误(如果我使用它们,一切都会完美无缺)但我想知道为什么我的问题在我使用它们时得到解决,以及是否使用这两种方法中的一种是安全的。

这是我第一次发布问题,如果我以错误的方式发布问题,请原谅我。

最佳答案

因为 CADisplayLink 在后台线程上回调,所以完全有可能通过安排有问题的数组从所述线程中删除给定对象,另一个正在改变或枚举数组的过程中,这会引发异常。前两个方法不起作用,因为它们需要同步访问数组(NSMutableArray 不提供),并且它们在当前线程的运行循环中调度,而不是主线程,因此无法保证它们各自的执行不要同时访问同一个资源。底部的两个工作是因为,假设你在主线程上改变数组,运行循环不可能安排枚举指令和同时改变指令(一个线程不能同时运行两段代码)同时,尤其是当该代码被安排在运行循环的下一次迭代中时),因此访问数组要安全得多。通过使用延迟,您创建了一个竞争条件,到目前为止它对您有效,但稍后会回来困扰您。

关于iphone - 使用某些类型的方法删除对象时出现 NSMutableArray 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15349294/

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