我需要在CCSpeed延迟后调用一个函数,以便我可以动态更改速度。据我所知,我不能在CCSequence中使用CCSpeed,所以我尝试在CCSpeed中使用CCSequence(CCDelayTime,CCCallFuncND,nil),这似乎也不起作用。有人有什么建议吗?
在我的BackgroundLayer类中,我有一个NSNumber * multiplierSpeed; :
@interface BackgroundLayer : CCLayer {
NSNumber *multiplierSpeed;
}
@property (nonatomic, retain) NSNumber *multiplierSpeed;
-(void)rotateWorldAndSwapIn:(id)sender data:(int)frame;
@end
在我的实施中:
@synthesize multiplierSpeed;
-(id)init {
self = [super init];
if (self != nil) {
//...
multiplierSpeed = [NSNumber numberWithFloat:1.0f];
CCSpeed *delay = [CCSpeed actionWithAction:[CCSequence actions:[CCDelayTime actionWithDuration:20],[CCCallFuncND actionWithTarget:self selector:@selector(rotateWorldAndSwapIn:data:) data:(void*)3], nil] speed:1.0f];
[delay setTag:10];
[self runAction:delay];
//...
}
}
-(void)rotateWorldAndSwapIn:(id)sender data:(int)frame {
CCLOG(@"test"); //This is fine
CCLOG(@"multiplierSpeed=%f",[multiplierSpeed floatValue]); //Crashes here
//...
}
我收到此错误:
callbackMethod_上的EXC_BAD_ACCESS(targetCallback_,selector_,target_,data _);
在CCActionInstant.m文件中。
另外,是因为CCSpeed包裹了没有延迟的CCCallFuncND,这会引发这个错误吗?如果是的话,你有其他建议吗?
感谢您的帮助!
答案 0 :(得分:1)
因为这个而崩溃:
multiplierSpeed = [NSNumber numberWithFloat:1.0f];
...不会保留在您的init中。当您进入动作回调时,该对象已被释放且无效。无论如何,将该值存储在NSNumber中可能没有充分的理由。将您的iVar设置为CGFloat,然后您可以存储和访问乘数而无需担心保留。如果你真的需要它作为NSNumber,你需要在init(或通过属性)中保留它,然后在适当时释放它,至少在你的dealloc中。
答案 1 :(得分:1)
您需要使用self.multiplierSpeed而不是multiplierSpeed。
self.multiplierSpeed = [NSNumber numberWithFloat:1.0f];
然后在CCLOG,
CCLOG(@"multiplierSpeed=%f",[self.multiplierSpeed floatValue]); //Won't crash anymore
除非你使用self.varName,否则Objective-c将不会使用getter / setter方法,而是会尝试直接访问实例变量,导致内存访问不良(因为没有为该var分配内存)