【问题标题】:objective-c Parameters not passes properlyobjective-c 参数未正确传递
【发布时间】: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)'
  • beginend 是整数,不要用%@ 打印它们,使用%d

标签: objective-c ios xcode


【解决方案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 StackOverflowHelp[748:903] swap: set = 'Hello', first = '0', second = '0'
2011-12-30 14:19:00.504 StackOverflowHelp[748:903] swap: set = 'Hello', first = '0', second = '0'

*注意objective-c中的函数,名字就像描述

*我没有使用 NSInteger,而是使用了普通的 int,因为这里不需要 NSInteger

*当使用 NSLog 或字符串格式化时,%@ 用于对象(NSString,NSInteger...),%i 用于int,%f 是浮点数,%d 是双精度数

希望对您有所帮助,祝您编码愉快!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-24
    • 2012-07-30
    • 1970-01-01
    • 2022-01-25
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多