【问题标题】:Objective C - Make Method Call Itself Only OnceObjective C - 让方法只调用一次
【发布时间】:2012-05-08 09:26:55
【问题描述】:

如果我有这个方法:

-(void) methodName
{
    action1;
    action2;
    [self methodName];
}

我希望 [self methodName] 调用只执行一次,因此该方法只连续调用两次。这可以做到吗?不确定我应该在文档中的哪个位置查找。

每当调用方法“methodName”时,当 action1 和 action2 完成时,它应该再次调用自身,但只调用一次。在我编写的示例代码中完成的方式将永远持续下去(我猜)。

【问题讨论】:

  • 不,不是在整个程序执行期间。如果调用了方法“methodName”,那么当 action1 和 action2 完成时,它应该再次调用自身,但只调用一次。在我编写的示例代码中它的完成方式将永远持续下去(我猜)。
  • 感谢 Mat,刚刚编辑了问题。

标签: objective-c cocoa


【解决方案1】:

如果你的意思是在应用程序的整个生命周期中只说一次,你可以使用dispatch_once,像这样:

-(void)methodName
{
    action1;
    action2;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
       [self methodName];
    });
}

但是,如果您打算让方法在每次调用时执行两次 action1action2,您有两种选择:

1) 将该功能包装在另一种方法中:

- (void)executeMethod {
    [self methodName];
    [self methodName];
}

2) 更简单,将其包装在一个循环中:

- (void)methodName {
   for(int i = 0; i < 2; ++i) {
      action1();
      action2();
   }

   //...
}

【讨论】:

  • 这很有意义,但是我宁愿将方法降低到最低限度,但是我会记住这个答案。谢谢。
【解决方案2】:

你可以使用静态变量:

-(void) methodName
{
    static BOOL called = NO;
    if (called == NO)
    {
        called = YES;
        [self methodName];
    }
    else
    {
        called = NO;
    }
}

【讨论】:

  • 这不会总是将 BOOL 值设置为 NO 吗?谢谢。
  • 不,静态变量的初始化在程序生命周期内只发生一次。
  • 是和否。此代码使该方法被调用两次。在它被调用后,“被调用”布尔值设置为 YES 以防止第三次调用。当它第二次被调用时,“被调用”布尔值被设置回“NO”以准备另一个调用(这将再次运行它两次)!不错的 sn-p Binyamin
  • @Tieme - 我听到了,但问题指定该方法应该只被调用 两次,而不是一次。
  • 是的,当然!通过调用该方法,它现在“自动”第二次调用自己:)
【解决方案3】:

最简单的做法是将其拆分为两种方法:

-(void) subMethodName
{
    action1;
    action2;
}

-(void) methodName
{
    [self subMethodName];
    [self subMethodName];
}

或者使用某种形式的循环。

(您在原始代码中拥有的是无限递归 - 一般而言,这不是一件好事。)

【讨论】:

    【解决方案4】:

    您需要对其应用一些逻辑。这可以使用 Bool 变量或简单的计数。

    int Count=0; //as a global variable.
    

    现在只需修改你的方法如下

    -(void) methodName
    {
        Count++;
        action1;
        action2;
        if(Count==1)
           [self methodName];
    }
    

    【讨论】:

    • 如何重置计数器以便下次运行该方法时可以应用相同的逻辑?
    • 目前的情况,我觉得还是会死循环的那种情况..
    • 将相同的逻辑复位计数应用到 0
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-24
    • 2011-02-16
    • 2023-03-29
    • 2017-11-05
    • 2011-04-24
    • 1970-01-01
    • 2013-06-14
    相关资源
    最近更新 更多