【问题标题】:SKAction Perform Selector syntax errorSKAction 执行选择器语法错误
【发布时间】:2014-12-28 07:52:09
【问题描述】:

使用 SKAction 序列,我尝试添加延迟,然后调用带有两个参数的方法,但是我不断收到以下信息(对于 obj c 来说,这可能很简单):

// code 
SKAction *fireAction = [SKAction sequence:@[[SKAction waitForDuration:1.5 withRange:0],
                                [SKAction performSelector:@selector(addExplosion:firstBody.node.position  andTheName: @"whiteExplosion") onTarget:self]]];

// 错误

预期的':'

方法声明

-(void) addExplosion : (CGPoint) position andTheName :(NSString *) explosionName{

当我替换一个不带参数的方法调用时似乎工作正常。

任何意见表示赞赏。

【问题讨论】:

    标签: sprite-kit skaction


    【解决方案1】:

    使用[SKAction runBlock:^{}] 代替选择器。

    如果方法没有参数,我会使用选择器。使用块要强大得多。但要注意如何使用它们,因为它可能会使预期的已删除对象保持活动状态。

    __weak typeof(self) weakself = self;
    SKAction *fireAction = [SKAction sequence:@[
                            [SKAction waitForDuration:1.5 withRange:0],
                            [SKAction runBlock:^{
        [weakself addExplosion:position andTheName:explosionName];
    }]]];
    

    或者使用完成块:

    __weak typeof(self) weakself = self;
    SKAction *fireAction = [SKAction waitForDuration:1.5 withRange:0];
    
    [someNode runAction:fireAction completion:^{
        [weakself addExplosion:position andTheName:explosionName];
    }];
    

    【讨论】:

    • 这种情况下是否需要weakself?
    • 谢谢,不确定对 self 的弱引用,我这样做是为了避免保留循环吗?
    • 我认为这里不需要weakself,因为该操作也在self对象上运行。如果节点(自身)从场景中移除,它会清理(移除)其所有动作,因此不会有保留周期。
    • 好的。首先,感谢cmets。其次,我很好奇。所说的是部分正确的。如果这是最后一个操作,则不需要weak ref。但是,如果有任何其他使用 strong 引用的操作正在运行,则不会释放场景。我上传了一个场景代码来测试这个:gist.github.com/naterhat/5399eec40eaa23edbfbc。只需将动作块视为 GCD。请让我知道是否有意义。
    【解决方案2】:

    @selector 的正确语法是:

     @selector(addExplosion:andTheName:)
    

    你必须省略实际的变量名,只需要指定参数名。

    还允许我建议“andTheName”是一个错误的参数名称,ObjC 指南特别声明不要使用“and”。如果您的选择器参数被命名为以下两个之一,那么您不会失去可读性:

     @selector(addExplosion:name:)
     @selector(addExplosion:withName:)
    

    【讨论】:

    • 好的,但是我们如何将参数传递给方法调用?
    • 其实你做不到。 SKAction 文档没有明确说明,所以我假设选择器必须是不带参数的选择器。如果你想像 Nate 的回答那样传入变量 runBlock 是更好的选择。
    • 好吧,runBlock 似乎是更好的选择,感谢大家的反馈
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    相关资源
    最近更新 更多