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

And*_*rea 3 iphone objective-c

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

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

-(BOOL) myfunction:(NSString *)myvar {
myvar = @"OK!";
return YES;
}
Run Code Online (Sandbox Code Playgroud)

现在在我的主文件中:

NSString *var;
BOOL control = myfunction:var;
if(control)
  NSLog(@"var is: %@",var);
Run Code Online (Sandbox Code Playgroud)

但输出是"var is:".如果我建在调试模式下,将断点设置在函数的开始MyFunction的内存地址MYVAR等于为VAR,但分配后的地址MYVAR是从的地址不同的变种.我该如何解决?提前致谢!

Abi*_*ern 7

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

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

更像Objective-C的方法是传递字符串和NSError **作为参数并返回字符串或nil以指示失败,如错误处理编程指南中所述

所以写这个的方法是:

- (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;
}
Run Code Online (Sandbox Code Playgroud)

并使用它:

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]);
}
Run Code Online (Sandbox Code Playgroud)

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


Ric*_*ard 4

从语法上讲,您需要像这样修复 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);
Run Code Online (Sandbox Code Playgroud)