3つのクラスに問題があります。最初のクラスは と呼ばれ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;
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
Unit.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;
}
中身はどうなるか関係ないので、弾丸クラスは省略します。また、残りはこの例では役に立たないため、すべてのクラスとコンストラクターが短縮されました
編集:
追加するのを忘れていたもう 1 つのことは、追加しようとしている update メソッドの NSMutableArray ユニットの列挙でタイマーが作成されることです。また、Unit と Bullet に、削除するように命令する変数を追加しています。箇条書きの更新は位置を変更し、deleteFromList 変数も変更します