我是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 的地址不同。我该如何解决?提前谢谢!
答案 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);