gpt4 book ai didi

objective-c - NSMutableArray 在枚举时发生了变化

转载 作者:行者123 更新时间:2023-12-03 17:29:57 26 4
gpt4 key购买 nike

我在一个旧的 Objective-C 应用程序中有一个数组,我用它来学习更多“复杂”的编码。它是从 OS X 的旧时代回来的,而且已经很破烂了。我已经让它工作了(大部分)!然而,该应用程序有一个 NSMutableArray 图像,总共 7 个。我使用随机数生成器在屏幕上插入图像,并使用一些代码让它们下落,然后使用屏幕边界,当它们在 Y 轴上达到“0”时,它们就会从数组中删除。我最初只是:

if( currentFrame.origin.y+currentFrame.size.height <= 0 )
{
[flakesArray removeObject:myItem];

我读过,当从数组中删除对象时,最佳实践是反向迭代......所以我有这段代码:

for (NSInteger i = myArray.count - 1; i >= 0; i--)
{ //added for for statement
if( currentFrame.origin.y+currentFrame.size.height <= 0 )
{
[myArray removeObjectAtIndex:i];
}

遗憾的是,这两种方法都会导致相同的突变枚举错误。我错过了一些明显的东西吗?如果我添加一个 NSLog 语句,我想我可以获得需要删除的项目的索引:

NSLog (@"Shazam! %ld", (long)i);

2017-01-07 14:39:42.086667 MyApp[45995:7500033] Shazam! 2

我查了很多资料并尝试了几种不同的方法,包括这个 one ,它看起来是最受欢迎的,但也有同样的错误。

提前谢谢您!我很乐意提供任何其他信息!

添加更多:抱歉,我没有明确调用 NSFastEnumeration 但我有这个:

- (void) drawRectCocoa:(NSRect)rect
{
NSEnumerator* flakesEnum = [flakesArray objectEnumerator];

然后

for( i = 0; i < numberToCreate; i++ )
{
[self newObject:self];
}
while( oneFlake = [flakesEnum nextObject] )

它在这里:

 if( currentFrame.origin.y+currentFrame.size.height <= 0 )
{
NSLog (@"Shazam! %i", oneFlake);
[flakesArray removeObject:oneFlake];
}

谢谢大家。我从这次讨论中学到了很多东西!

最佳答案

有两种方法:(1) 收集要删除的对象,然后使用 removeObjectsInArray: 删除它们。 .

NSMutableArray *removeThese = [NSMutableArray array];
for (id item in myArray) {
if (/* item satisfies some condition for removal */) {
[removeThese addObject:item];
}
}

// the following (and any other method that mutates the array) must be done
// *outside of* the loop that enumerates the array
[myArray removeObjectsInArray:removeThese];

或者,reverseObjectEnumeration 可以容忍迭代期间的删除...

for (id item in [myArray reverseObjectEnumerator]) {
if (/* item satisfies some condition for removal */) {
[myArray removeObject: item];
}
}

关于objective-c - NSMutableArray 在枚举时发生了变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41525711/

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