将NSString变量传递给函数并进行修改

时间:2011-02-08 15:02:45

标签: iphone objective-c

我是Objective-c的新手,这是我的第一篇文章。这是我的问题:

在我的主文件中,我有一个变量:NSString * var; 然后我有一个功能:

-(BOOL) myfunction:(NSString *)myvar {
myvar = @"OK!";
return YES;
}

现在我在主文件中执行:

NSString *var;
BOOL control = myfunction:var;
if(control)
  NSLog(@"var is: %@",var);

但输出为“var is:”。如果我在调试模式下构建,并在函数 myfunction 的开头放置一个断点, myvar 的内存地址等于到var ,但之后分配 myvar 的地址与 var 的地址不同。我该如何解决?提前谢谢!

3 个答案:

答案 0 :(得分:7)

虽然到目前为止给出的答案是正确的。我认为一个更为相关的问题是你为什么要这样做。

看起来你想要一种防御性编程风格,其中返回代码表示成功或失败。

更像Objective-C的方法是将字符串和NSError **作为参数传递并返回字符串或nil以指示失败,如Error Handling Programming Guide中所述

所以写这个的方法是:

- (NSString *)aStringWithError:(NSError **)outError {
    returnString = @"OK";
    if (!returnString) {
        if (outError != NULL) {
            NSString *myErrorDomain = @"com.company.app.errors";
            NSInteger errNo = 1;
            *outError = [[[NSError alloc] initWithDomain:myErrorDomain code:errNo userInfo:nil] autorelease];
        }
    }
    return returnString;
}

使用它:

NSError *error;
NSString *stringVariable = [self aStringWithError:&error];
if (!stringVariable) {
    // The function failed, so it returned nil and the error details are in the error variable
    NSLog(@"Call failed with error: %ld", [error code]);
}

这是一个简单的例子,但你可以看到你可以构造并返回更有意义的错误信息,而不仅仅是它是否成功。

答案 1 :(得分:4)

您也可以使用NSMutableString

-(BOOL) myfunction:(NSMutableString *)myvar {
    [myvar setString:@"OK!"];
    return YES;
}

并按如下方式更改您的通话网站:

NSMutableString *var = [NSMutableString string];
BOOL control = [self myfunction:var];
if(control)
  NSLog(@"var is: %@",var);

答案 2 :(得分:1)

从语法上讲,您需要修复myFunction调用,如下所示: BOOL control = [self myfunction:var];

这里真正的问题是,在myFunction内部,您只是将字符串值赋给本地字符串变量,而您想要更改它指向的基础字符串。 这通常是Obj-C中的错误方法,但您可以这样做:

-(BOOL)myfunction:(NSString **)myvar
{
  *myvar = @"OK!";
  return YES;
}

NSString *var;
BOOL control = [self myfunction:&var];
if(control)
  NSLog(@"var is: %@",var);