我有三个类的问题。第一类称为Player
。这个类NSMutableArray
里面有一个叫做units
. 该数组由类的对象组成Unit
。反过来,这个类有一个NSMutableArray
被调用的bullets
. 它是这样工作的:
在某个时刻,该类Player
(它可能只是ViewController
相反)将一个对象添加到units
. 然后,当初始化 的实例时Unit
,由于上述原因,它会创建一个 NSTimer 负责每秒创建子弹。
问题是,在这中间的某个地方崩溃了SIGABRT
,告诉我有一个例外,因为:Collection <__NSArrayM: 0xb1a2970> was mutated while being enumerated.
另外,我拿走了产生子弹的线,它停止崩溃,证明这是问题所在。这意味着什么!
这是一些可能有效的可执行代码:
ViewController.h(而不是播放器)
@interface ViewController : UIViewController
{
NSMutableArray *units;
NSTimer *updateTimer;
}
-(void)Update;
视图控制器.m
@implementation ViewController
//methods...
- (void)viewDidLoad
{
//more default code
//Initialized array and adds one object with the default constructor for simplicity
units = [[NSMutableArray alloc] initWithObjects:[[Unit alloc] init], nil]
}
-(void)Update
{
for(Unit *unit in units)
{
[unit Update];
if(unit.deleteFromList)
[units removeObject:unit];
}
}
//More methods
@end
单位.h
@interface Unit : NSObject
{
NSMutableArray *bullets;
NSTimer *bulletTimer;
boolean deleteFromList;
}
@property(readonly, assign)deleteFromList;
-(void)Fire;
-(void)Update;
单位.m
@implementation Unit
@synthesize deleteFromList;
-(id)init
{
if(self)
{
bullets = [[NSMutableArray alloc] init];
bulletTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(fire) userInfo:NULL repeats:true];
deleteFromList = false;
}
return self;
}
-(void)Fire
{
[bullets addObject:[[Bullet alloc] init]];
}
-(void)Update
{
for(Bullet *bullet in bullets)
{
[bullet Update];
if(bullet.deleteFromList)
[bullets removeObject:bullet];
}
if(certainCondition)
deleteFromList = true;
}
项目符号类将被省略,因为内容与发生的事情无关。此外,所有的类和构造函数都被缩短了,因为其余的对于这个例子是无用的
编辑:
我忘记添加的另一件事是,计时器是在我将要添加的更新方法中的 NSMutableArray 单元的枚举中创建的。我还向 Unit 和 Bullet 添加了一个变量,命令它删除。子弹更新改变了位置,也改变了 deleteFromList 变量