Ios5 访问cocos2d计划方法中的实例变量时崩溃
新鲜至objC和cocos2d:) 我正在学习“用iOS5学习cocos2d游戏开发”,在第4章中,有一个“DoodleDrop”游戏 在Ios5 访问cocos2d计划方法中的实例变量时崩溃,ios5,cocos2d-iphone,Ios5,Cocos2d Iphone,新鲜至objC和cocos2d:) 我正在学习“用iOS5学习cocos2d游戏开发”,在第4章中,有一个“DoodleDrop”游戏 在gamesene.h中定义一些变量,如下所示 @interface GameScene : CCLayer { CCSprite *player; CGPoint playerVelocity; CCArray *spiders; CGSize screenSize; int dropedSpidersCount;
gamesene.h
中定义一些变量,如下所示
@interface GameScene : CCLayer
{
CCSprite *player;
CGPoint playerVelocity;
CCArray *spiders;
CGSize screenSize;
int dropedSpidersCount;
float duration;
}
+ (CCScene *)scene;
@end
- (id)init
{
if (self = [super init]) {
duration = 4.0;
[self createPlayer];
[self createSpiders]; // spiders were inited here.
[self resetSpiders];
[self schedule:@selector(chooseSpider:) interval:0.7];
}
return self;
}
在GameScene.m
中,init
方法如下所示
@interface GameScene : CCLayer
{
CCSprite *player;
CGPoint playerVelocity;
CCArray *spiders;
CGSize screenSize;
int dropedSpidersCount;
float duration;
}
+ (CCScene *)scene;
@end
- (id)init
{
if (self = [super init]) {
duration = 4.0;
[self createPlayer];
[self createSpiders]; // spiders were inited here.
[self resetSpiders];
[self schedule:@selector(chooseSpider:) interval:0.7];
}
return self;
}
在chooseSpider
中,我无法访问spider
,xcode中断
在其他方法中,spider
或duration
只是正常运行,为什么会发生这种情况
添加了要点代码
检查代码后,我建议您尝试以下修复:
- (void)createSpiders
{
CCSprite *tempSpider = [CCSprite spriteWithFile:@"spider.png"];
CGSize spiderSize = [tempSpider texture].contentSize;
int spiderCount = screenSize.width / spiderSize.width;
spiders = [[CCArray arrayWithCapacity:spiderCount] retain];
for (int i = 0; i < spiderCount; i++) {
CCSprite *spider = [CCSprite spriteWithFile:@"spider.png"];
[self addChild:spider];
[spiders addObject:spider];
}
}
实际上,如果您没有保留spider
对象,它将在下一次运行循环迭代时自动删除
旧答案:
如果看不到更多的代码,就不可能准确地说出发生了什么,但是在创建spider和实际执行choosespider
之间的时间间隔内,您的spider
数组将被释放
作为快速尝试,我建议添加:
[spiders retain];
打电话之前
[self schedule:@selector(chooseSpider:) interval:0.7];
看看坠机是否继续发生
如果您提供更多的代码,就有可能进一步帮助您。在您第一次调用chooseSpider时,这种情况已经发生了吗?你能发布
createspider
code吗?@sergio刚刚在[self schedule:…]之前登录,spider
正常<代码>NSLog(@“%d”,[spider count])代码>输出为10。在书中,spider数组是alloc'd&init'd:spider=[[CCArray alloc]initWithCapacity:spiderCount];顺便说一句,spider是GameSecene类的一个实例变量,而不是全局变量。@learncos2D感谢您的解释。你是对的,我错过了一些东西。谢谢@sergio,它又崩溃了:(gist中提供了更多的代码。你的意思是下一次运行循环
?我可以将爬行器设置为这样的属性吗@属性(非原子,保留)CCSprite*spiders
因此我可以忽略CCArray
init中的retain
部分?是的,如果您分配throu:self.spiders=[CCArray…],您可以定义一个retain属性并明确保留retain;至于运行循环迭代,当autorelease池可能为空时。。。