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)' beginend 是整数,不要用%@ 打印它们,使用%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 参数未正确传递的主要内容,如果未能解决你的问题,请参考以下文章

将 Objective-C 协议委托作为参数传递

我是不是正确地创建了这个 C 数组并将其传递给 Objective-C 方法并使用属性引用它?

如何在 Objective-C 中将 BOOL 变量作为参数传递?

iOS JSON解析Objective-C并传递POST方法参数

如何在文件之间重用相同的代码并选择在objective-c中传递参数?

GraphQL - 参数未在突变中传递到后端