【发布时间】:2012-05-30 01:51:43
【问题描述】:
我遇到了三个类的问题。第一类称为Player。这个类里面有一个NSMutableArray,叫做units。该数组由Unit 类的对象组成。反过来,这个类有一个名为bullets 的NSMutableArray。它的工作原理是这样的:
在某个时刻,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;
ViewController.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 变量
【问题讨论】:
-
你什么时候枚举
bullets? -
完全不拍会不会出现这个问题?
-
不,如果我评论创建项目符号的行,它可以工作
标签: xcode exception nsmutablearray sigabrt