大约一年前,当我第一次进入编程时,我学到了变量不会超出它们创建条件范围的困难方法。例如:
-(void)someMethod {
if (x == y) {
NSString *string = [[NSString alloc] initWithString:@"Foo"];
NSLog(string); // outputs "Foo" to console successfully
}
...
NSLog(string); // Doesn't work, we're out of the scope of the "if" statement.
}
我的问题是,有没有办法在条件语句中动态创建变量,并且能够在其他时间访问它们,有点像我在@interface
中声明它?
编辑我想我没有解释清楚,我的意思是如果我想稍后使用在其他方法中。
答案 0 :(得分:5)
您只需在if之外声明(并可选地初始化)变量。如下所示:
-(void)someMethod {
NSString *string = nil;
if (x == y) {
string = [[NSString alloc] initWithString:@"Foo"];
NSLog(string); // outputs "Foo" to console successfully
}
...
NSLog(string);
}
修改强>
为了回应你的澄清,这里的'string'是一个局部变量,是这个方法的本地变量。您还有其他选项,例如实例变量。像这样的实例方法(以' - '开头的实例)将可以访问此实例的(此对象的)实例变量。
所以你可以这样做:
@interface MyClass : NSObject {
NSString *string; // <<-- This is an instance variable (aka "ivar")
}
- (void)someMethod;
- (void)someOtherMethod;
@end
@implementation MyClass
- (void)someMethod {
string = @"Foo";
}
- (void)someOtherMethod {
NSLog (string);
// will print "Foo" provided someMethod was called before this method
}
@end
显然,除此之外你还可以得到一个简短的回答。你可以拥有全局变量。如果您不熟悉该语言,则应将属性读取为封装实例变量的非常有用的工具(当您想要正确获取内存管理时非常有用)。但希望至少让你指出正确的方向。
答案 1 :(得分:1)
-(void)someMethod {
NSString *string = nil;
if (x == y) {
string = [[NSString alloc] initWithString:@"Foo"];
NSLog(string); // outputs "Foo" to console successfully
}
...
NSLog(string); // Doesn't work, we're out of the scope of the "if" statement.
}
答案 2 :(得分:1)
考虑一下你在问什么。你从:
开始-(void)someMethod
{ if (x == y)
{ NSString *string = [[NSString alloc] initWithString:@"Foo"];
NSLog(string); // outputs "Foo" to console successfully
}
...
NSLog(string); // Doesn't work, we're out of the scope of the "if" statement.
}
您希望第二个NSLog
做什么?如果if
语句的主体已被执行,或者是什么,您似乎要求它可以正常工作?产生动态的“未声明的变量”错误?
现在你似乎想要:
-(void)someMethod
{ if (x == y)
{ NSString *string = [[NSString alloc] initWithString:@"Foo"];
NSLog(string); // outputs "Foo" to console successfully
}
...
}
-(void)someOtherMethod
{
NSLog(string); // Doesn't work, we're out of the scope of the "if" statement.
}
如果someOtherMethod
中if
语句的正文尚未执行,您希望在someMethod
中发生什么?
正如@ Daniel的解决方案指出的那样,如果变量位于范围中,则可以引用该变量。在单个方法的情况下,您将声明点移出if
并进入封闭的方法体。在两种方法的情况下,您将它移动到类 - 作为实例变量。
现在范围与生命周期不同 - 变量可以存在(活着),但不可访问(它超出范围);常见的例子是当一个方法调用另一个方法时,调用方法的变量保持活动但被调用的方法无法访问。
以类似的方式,变量位于范围并不意味着它必须包含有效的值。这就是为什么@Daniel将nil
放入变量中 - 您知道是否已在if
的正文中创建了一个值,string
的值不是nil
。
所以也许这就是你似乎在寻找的“动态”行为 - 你必须声明某种方式来引用值(变量),但你指出它是否是通过存储一些标记来创建的(nil
在这种情况下)在变量中。