【发布时间】:2011-12-30 17:42:57
【问题描述】:
我有以下代码:
[self swap:set :begin :begin+i]; //swap
调用以下交换方法:
-(void) swap:(NSMutableString *)set:(NSInteger)first:(NSInteger)second
{
NSRange rangeSecond = NSMakeRange((NSUInteger) second, 1);
NSRange rangeFirst = NSMakeRange((NSUInteger) first, 1);
NSString *chsecond = [set substringWithRange:rangeSecond ];
[set replaceCharactersInRange:rangeSecond
withString:[set substringWithRange:rangeFirst]];
[set replaceCharactersInRange:rangeFirst
withString:chsecond];
}
第一次调用此交换例程时,它会在以下语句处崩溃:
[set replaceCharactersInRange:rangeSecond
withString:[set substringWithRange:rangeFirst]];
不留下任何调试信息。 在调用 swap 之前,我可以将鼠标悬停在 set、begin 和 i 上,它们都有有效值。当我将鼠标悬停在“第一个”上时调用交换后,它说(数据变量,没有调试信息)首先(未知类型)
这个程序运行良好,但突然发生了。知道为什么会这样吗?谢谢
这是整个调用链。开始 StartPermutate 调用 permute 调用交换。 我传参数的方式有问题吗?
-(void) permute: (NSMutableString *) set :(NSInteger ) begin :(NSInteger ) end {
int i;
int range = end - begin;
if(range == 1) {
if([self is_word_valid:set]) {
[self addWord:selectedWords : set];
}
} else {
for(i=0; i<range; i++) {
NSLog(@"set = '%@', first = '%@', second = '%@'", set, begin, begin + i);
[self swap:set :begin :begin+i]; //swap
[self permute:set :begin+1 :end]; // recursion
[self swap:set :begin :begin+i]; // swap back
}
}
}
-(NSMutableArray *)StartPermutate: (NSMutableString *) letters {
[self permute:letters :0 :(NSInteger)[letters length]];
return selectedWords;
}
【问题讨论】:
-
那个方法名实在是太可怕了。另外,您的代码要做什么?请用文字描述你想要做什么。然后,如果您的代码,人们可以更轻松地找到逻辑错误。
-
swap 中的代码只是交换位于“first”和“second”位置的两个字符。但真正的问题可能是值没有像我解释的那样传递给交换中的“第一”。
-
使用 NSLog 打印您的字符串、字符串长度以及进入方法时的两个位置值。
-
set = 'happy', first = '(null)', second = '(null)'
-
begin和end是整数,不要用%@打印它们,使用%d
标签: objective-c ios xcode