3

如果我有这个方法:

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

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

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

4

4 回答 4

15

如果您的意思是在应用程序的整个生命周期中只说一次,您可以使用dispatch_once,如下所示:

-(void)methodName
{
    action1;
    action2;

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

但是,如果您打算执行该方法action1并且action2每次调用两次,那么您有两个选择:

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

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

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

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

   //...
}
于 2012-05-08T09:28:54.493 回答
6

您可以使用静态变量:

-(void) methodName
{
    static BOOL called = NO;
    if (called == NO)
    {
        called = YES;
        [self methodName];
    }
    else
    {
        called = NO;
    }
}
于 2012-05-08T09:28:54.950 回答
3

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

-(void) subMethodName
{
    action1;
    action2;
}

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

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

(您在原始代码中拥有的是无限递归 - 通常不是一件好事。)

于 2012-05-08T09:32:11.343 回答
1

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

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

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

-(void) methodName
{
    Count++;
    action1;
    action2;
    if(Count==1)
       [self methodName];
}
于 2012-05-08T09:31:53.373 回答