3

私がこの方法を持っている場合:

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

[self methodName]の呼び出しを1回だけ実行したいので、メソッドは2回だけ連続して呼び出されます。これはできますか?ドキュメントのどこを探すべきかわからない。

メソッド'methodName'が呼び出されるたびに、action1とaction2が実行されると、それ自体を再度呼び出す必要がありますが、1回だけです。私が書いたサンプルコードでそれが行われる方法は永遠に続いています(私は推測しています)。

4

4 に答える 4

15

アプリケーションの存続期間全体で1回だけ言う場合は、次dispatch_onceのように使用できます。

-(void)methodName
{
    action1;
    action2;

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

ただし、メソッドを実行action1し、action2呼び出しごとに2回実行する場合は、次の2つのオプションがあります。

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

最も簡単な方法は、次の2つの方法に分割することです。

-(void) subMethodName
{
    action1;
    action2;
}

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

または、何らかの形式のループを使用します。

(元のコードに含まれているのは無限再帰です。一般的には良いことではありません。)

于 2012-05-08T09:32:11.343 に答える
1

あなたはそれにいくつかのロジックを適用する必要があります。これは、ブール変数または単にカウントを使用することができます。

取った

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

次に、メソッドを次のように変更します

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