NSMutableArray EXC_BAD_ACCESS当我尝试从它读取
问题描述:
我想要更新位置的粒子存储此信息我使用NSMutableArray。例如,我想每2秒更新一次。为此我尝试使用此代码。NSMutableArray EXC_BAD_ACCESS当我尝试从它读取
//ParticlesLayer.h
@interface ParticlesLayer : CCLayer {
CCQuadParticleSystem *particle;
NSMutableArray *partilesCoordinates;
}
@property (assign, readwrite) NSMutableArray *partilesCoordinates;
-(void)partilesMove:(ccTime)dt;
-(void)particleInit;
//ParticlesLayer.m
@implementation ParticlesLayer
@synthesize partilesCoordinates;
-(id) init {
self = [super init];
partilesCoordinates = [NSMutableArray arrayWithCapacity:5];
[partilesCoordinates addObject: [NSValue valueWithCGPoint:ccp(67,152)]];
[partilesCoordinates addObject: [NSValue valueWithCGPoint:ccp(140,147)]];
[partilesCoordinates addObject: [NSValue valueWithCGPoint:ccp(198,100)]];
[partilesCoordinates addObject: [NSValue valueWithCGPoint:ccp(261,126)]];
[partilesCoordinates addObject: [NSValue valueWithCGPoint:ccp(364,135)]];
// bla bla bla
//...
//bla bla bla
[self schedule:@selector(partilesMove:) interval:2];
return self;
}
-(void)emittersMove:(ccTime)dt{
NSMutableArray *newParticlesCoordinates = [NSMutableArray arrayWithCapacity:5];
CGPoint newPoint;
for (int i = 0; i < 5; ++i) {
[self particleInit];
NSLog(@"%@", [particlesCoordinates objectAtIndex:i]); // on this part of code i have problem
particle.position = [[particlesCoordinates objectAtIndex:i] CGPointValue];
[self addChild:emitter];
newPoint = emitter.position;
newPoint.x += 15;
newPoint.y += 15;
[newParticlesCoordinates addObject:[NSValue valueWithCGPoint:newPoint]];
}
[partilesCoordinates removeAllObjects];
[partilesCoordinates newParticlesCoordinates];
[newParticlesCoordinates removeAllObjects];
}
但是,当我在第一次调用函数运行它,并从particlesCoordinates阵列读取我有控制台消息:程序接收到的信号:“EXC_BAD_ACCESS”。我如何制定正常工作时间表?
答
[NSMutableArray arrayWithCapacity:5]
返回一个自动释放实例,并在离开初始化程序一段时间后得到清理。现在指针partilesCoordinates
指向未定义的内存。你需要做的:
partilesCoordinates = [[NSMutableArray arrayWithCapacity:5] retain];
或
partilesCoordinates = [[NSMutableArray alloc] initWithCapacity:5];
答
更改此:
@property (assign, readwrite) NSMutableArray *partilesCoordinates;
这样:
@property (nonatomic, retain) NSMutableArray *partilesCoordinates;
并改变这一点:
partilesCoordinates = [NSMutableArray arrayWithCapacity:5];
到:
self.partilesCoordinates = [NSMutableArray arrayWithCapacity:5];
当您为“分配”属性合成一个setter时,访问器不会保留您传递它的值。
+0
良好的渔获,没有看到他使用属性,因此也错过了他的错误声明。 – DarkDust 2010-10-19 10:01:01
谢谢这是非常好的工作 – Mike 2010-10-19 10:08:05