esq*_*qew 3 macos cocoa objective-c osx-snow-leopard
我知道这个问题的标题有点令人困惑,但无论如何它仍然存在:
我在if声明之后创建了一个NSString,但它似乎并不想在语句之外保留.我的条件如下:
if ([[password stringValue] isEqualToString:@""]) {
NSString *pwd = [[NSString alloc]initWithString:@"password"];
}
else {
NSString *pwd = [[NSString alloc]initWithFormat:@"%@", [password stringValue]];
}
Run Code Online (Sandbox Code Playgroud)
...我pwd稍后会在脚本中调用这样的:
NSArray *arguments;
arguments = [NSArray arrayWithObjects: ip, pwd, nil];
[task setArguments: arguments];
Run Code Online (Sandbox Code Playgroud)
但是当我以这种方式这样做时,第一个片段会返回警告,Unused variable 'pwd'而后一个调用最终会出现错误'pwd' undeclared.
我在这做错了什么?提前致谢.;)
Mic*_*yan 19
使用:
NSString* pwd = nil;
if ([[password stringValue] isEqualToString:@""]) {
pwd = [[NSString alloc]initWithString:@"password"];
} else {
pwd = [[NSString alloc]initWithFormat:@"%@", [password stringValue]];
}
问题是每个块都引入了一个范围.变量仅存在于定义它的范围内(变量存在于声明点到声明范围的末尾).虽然"pwd"指向的内存将比if ... else块更长,但是名为pwd的指针将在声明它的if ... else块之后停止存在.在块移动之前声明指针向上移动一个范围.
Ale*_*lli 10
这不是保留的问题,而是你的声明范围之一:括号内的声明有一个词法范围终止于右括号 - 该声明在块外不可见!所以只需在块之前移动您的声明,并且只在块中进行初始化,即:
NSString *pwd;
if ([[password stringValue] isEqualToString:@""]) {
pwd = [[NSString alloc]initWithString:@"password"];
}
else {
pwd = [[NSString alloc]initWithFormat:@"%@", [password stringValue]];
}
Run Code Online (Sandbox Code Playgroud)