我创建一个计数计时器(在标签上)和一个包含标签整数值(命名计数)的变量。我也创建了一个函数,检查我的数字是7,除以7还是包含7.当我尝试将计数值传递给检查函数时,我的应用程序是堆栈。我试了很长时间才发现为什么堆栈溢出发生但我没有成功。我怎么解决呢? 这是我的代码:
-(IBAction)start:(id)sender
{
timer = [NSTimer scheduledTimerWithTimeInterval:.01 target:self selector:@selector(updateTimer:) userInfo:nil repeats:YES];
MainInt = 0;
numbersTimer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(countup) userInfo:nil repeats:YES];
}
-(void)countup
{
MainInt += 1;
numbersLabel.text = [NSString stringWithFormat:@"%i", MainInt];
count = numbersLabel.text.intValue;
NSLog(@"num: %d", count);
if ([self checknum:(count) == false]) {
NSLog(@"BOOM");
}
}
-(BOOL)checknum:(int)number
{
while (number<10)
{
if(number ==7)
{
NSLog(@"boom, i=%d", number);
return true;
}
}
while (number>=10 && number<1000)
{
if(number % 7 == 0)
{
NSLog(@"boom i=%d", number);
return true;
}
if([self revese:(number)])
{
NSLog(@"boom reverse num = %d", number);
return true;
}
}
return false;
}
-(BOOL) revese:(int)number
{
if(number < 10 && number != 7)
return false;
if(((number % 10) == 7) || ((number / 10) == 7))
return true;
else {
[self revese:(number / 10)];
}
return false;
}
谢谢!
答案 0 :(得分:2)
声明
if ([self checknum:(count) == false]) {
NSLog(@"BOOM");
}
是胡说八道。你是有效的问
BOOL isLessThanOne = (count < 1);
if ([self checksum:isLessThanOne]) {
NSLog(@"BOOM");
}
更改此内容
if ([self checksum:count] == NO) {
NSLog(@"BOOM");
}
答案 1 :(得分:1)
有很多问题,但首先是这些问题:
while (number<10)
//
while (number>=10 && number<1000)
你想要一个if / else类型的条件语句。你现在拥有它的方式,因为你永远不会调整number
的值,如果不满足你在代码中稍后测试的严格条件,你将陷入无限循环。更像是:
if(number<10){
// do some tests
} else if (number<1000){
// do some other tests
}
还有其他问题,但这些都是一个开始。
答案 2 :(得分:0)
很难分辨,因为我无法真正看到你在做什么,但如果你有堆栈溢出,你的问题很可能就是递归的函数revese
。我敢打赌,你有一个特定的值被传递给revese
,导致它根据你在条件语句中使用的一些不寻常的逻辑被一遍又一遍地调用。您应该使用调试器仔细执行此功能,以确定发生这种情况的原因。