目标C - 使方法只调用一次

时间:2012-05-08 09:26:56

标签: objective-c cocoa

如果我有这个方法:

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

我希望[self methodName]调用只进行一次,因此连续两次调用的方法。可以这样做吗?不知道我应该在哪些文档中查找。

每当方法' methodName'被调用,然后当action1和action2完成时,它应该再次调用自己,但只调用一次。在我编写的示例代码中完成的方式将永远进行(我猜)。

4 个答案:

答案 0 :(得分:14)

如果您只想在应用程序的整个生命周期内说一次,可以使用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();
   }

   //...
}

答案 1 :(得分:6)

您可以使用静态变量:

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

答案 2 :(得分:3)

最简单的方法是用两种方法分割:

-(void) subMethodName
{
    action1;
    action2;
}

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

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

(原始代码中的内容是无限递归 - 一般来说不是一件好事。)

答案 3 :(得分:1)

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

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

现在只需修改您的方法

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