如果我有这个方法:
-(void) methodName
{
action1;
action2;
[self methodName];
}
我希望[self methodName]调用只进行一次,因此连续两次调用的方法。可以这样做吗?不知道我应该在哪些文档中查找。
每当方法' methodName'被调用,然后当action1和action2完成时,它应该再次调用自己,但只调用一次。在我编写的示例代码中完成的方式将永远进行(我猜)。
答案 0 :(得分:14)
如果您只想在应用程序的整个生命周期内说一次,可以使用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();
}
//...
}
答案 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];
}