Objective C - 让方法只调用一次

Posted

技术标签:

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

如果我有这个方法:

-(void) methodName

    action1;
    action2;
    [self methodName];

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

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

【问题讨论】:

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

以上是关于Objective C - 让方法只调用一次的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Swift 调用 Objective-C 类的工厂方法?

如何让一个方法等到另一个方法完成它在Objective C中工作?

Objective C 自动释放

使用 LLVM ExecutionEngine 调用 Objective-C 方法时,所有选择器都无法识别

快速调用objective-c类方法

Objective-C类方法 load 和 initialize