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];
);
但是,如果您打算让方法在每次调用时执行两次 action1
和 action2
,您有两种选择:
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中工作?