objective-c 参数未正确传递
Posted
技术标签:
【中文标题】objective-c 参数未正确传递【英文标题】:objective-c Parameters not passes properly 【发布时间】: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
【参考方案1】:
我想你在其他地方也问过同样的问题。所以这里的答案也适用于此。
我发现你的代码有一些地方需要改变。这是我为使您的交换功能正常工作所做的工作。
这是函数:
-(void) swapCharacters: (NSMutableString *)set withInteger: (int)first andInteger: (int)second
NSLog(@"swap: set = '%@', first = '%i', second = '%i'", set, first, second);
NSRange rangeSecond = NSMakeRange(second, 1);
NSRange rangeFirst = NSMakeRange(first, 1);
[set replaceCharactersInRange:rangeSecond withString:[set substringWithRange:rangeFirst]];
NSLog(@"swap: set = '%@', first = '%i', second = '%i'", set, first, second);
这是函数的调用方式:
FooClass *fooObjectVar = [[FooClass alloc] init];
NSMutableString *myString = [[NSMutableString alloc] initWithString:@"Hello"];
[fooObjectVar swapCharacters:myString withInteger:0 andInteger:0];
[fooObjectVar release];
[myString release];
这是输出:
2011-12-30 14:19:00.501 ***Help[748:903] swap: set = 'Hello', first = '0', second = '0'
2011-12-30 14:19:00.504 ***Help[748:903] swap: set = 'Hello', first = '0', second = '0'
*注意objective-c中的函数,名字就像描述
*我没有使用 NSInteger,而是使用了普通的 int,因为这里不需要 NSInteger
*当使用 NSLog 或字符串格式化时,%@ 用于对象(NSString,NSInteger...),%i 用于int,%f 是浮点数,%d 是双精度数
希望对您有所帮助,祝您编码愉快!
【讨论】:
以上是关于objective-c 参数未正确传递的主要内容,如果未能解决你的问题,请参考以下文章
我是不是正确地创建了这个 C 数组并将其传递给 Objective-C 方法并使用属性引用它?
如何在 Objective-C 中将 BOOL 变量作为参数传递?
iOS JSON解析Objective-C并传递POST方法参数