所以我这样做是为了初始化我的选择器:
//In .h
SEL selectors[3];
//In .m
selectors[0] = @selector(rotate);
selectors[1] = @selector(discharge);
问题在于:
当我在Cocos2d中的init方法中调用它时,如下所示:
[self performSelector:selectors[0]];
它工作正常,但是当我在一个名为moveThings的方法中调用这行代码时,它在Cocos2d的init方法结束时通过调度([self schedule:@selector(moveThings:)]
)调用,它给出了EXC_BAD_ACCESS
。安排事情有什么问题?
更新:
我发现旋转功能有问题(该功能存储在选择器[0]中)。这是:
-(void)rotate:(ccTime)delta {
if (((CCSprite *)[creature objectAtIndex:0]).rotation < 360) {
((CCSprite *)[creature objectAtIndex:0]).rotation++;
}
else {
((CCSprite *)[creature objectAtIndex:0]).rotation++;
}
}
如果我评论方法的内容,当通过moveThings和init调用时,它可以正常工作。
如果我用以下方法更改方法内容:
((CCSprite *)[creature objectAtIndex:0]).rotation++;
它失败了...但是,我想再说一遍,如果我在我的init方法中调用它,所有这些东西都能正常工作,甚至连续两次调用它,但它不起作用(除非我取出rotate方法的内容)如果我通过moveThings:方法调用它,通过调度方法调用它失败。
进一步更新:
如果我打电话:
((CCSprite *)[creature objectAtIndex:0]).rotation++;
在moveThings中(正如我之前所说,由schedule:(SEL)
方法调用),它失败了。只要没有通过调度方法调用它就可以工作。
答案 0 :(得分:6)
问题是当你调用performSelector时,只有两个选项:
后者将你搞砸到我怀疑的地方。
以下是performSelector
的三种形式:
- (id)performSelector:(SEL)aSelector;
- (id)performSelector:(SEL)aSelector withObject:(id)object;
- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;
你会注意到withObject参数都是{C}个类型,它是一个Objective C对象。
您尝试使用的选择器需要一个id
ccTime
和不一个Objective C对象作为它的参数,这就是事情崩溃的原因:
float
一个选项是创建一个包装方法,该方法包含-(void)rotate:(ccTime)delta;
并解包并调用ccTime
方法:
rotate:(ccTime)
然后使用
- (void) wrappedRotate: (NSNumber*) inDelta
{
[self rotate: [inDelta floatValue]];
}
然后通过以下方式致电:
selectors[0] = @selector(wrappedRotate:);
您感到困惑的一个原因是因为Cocos2d以更复杂的方式使用@selector(请参阅CCTimer :: initWithTarget中的CCScheduler.m:选择器:interval:特别是CCTimer :: update:方法)。
免责声明:代码输入SO所以不用编译器检查,但你需要的本质应该在这里。答案 1 :(得分:0)
确定的一个问题是,您在.h
内使用声明的变量,同时在相对.m
内初始化它。根据链接,我不确定只存在一个变量selectors
(因此包含.h
的不同文件将具有不同的版本)。
首先,我建议您尝试添加关键字extern
以便
extern SEL selectors[3];
告诉您的链接器它已在相对.m
内初始化并仅使用该链接器。
答案 2 :(得分:0)
我认为您的问题源于您的方法定义- (void)rotate;
而非- (void)rotate:(ccTime)dt;
您应该同样调整选择器。
答案 3 :(得分:0)
如果你的方法没有任何参数,那么不要在你的选择器调用中使用冒号。
// Requires @selector(foo:)
- (void) foo:(id)sender;
// Requires @selector(foo)
- (void) foo;