在条件外使变量可访问?

时间:2011-05-22 03:01:13

标签: objective-c

大约一年前,当我第一次进入编程时,我学到了变量不会超出它们创建条件范围的困难方法。例如:

-(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中声明它?

编辑我想我没有解释清楚,我的意思是如果我想稍后使用在其他方法中

3 个答案:

答案 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.
}

如果someOtherMethodif语句的正文尚未执行,您希望在someMethod中发生什么?

正如@ Daniel的解决方案指出的那样,如果变量位于范围中,则可以引用该变量。在单个方法的情况下,您将声明点移出if并进入封闭的方法体。在两种方法的情况下,您将它移动到类 - 作为实例变量。

现在范围生命周期不同 - 变量可以存在(活着),但不可访问(它超出范围);常见的例子是当一个方法调用另一个方法时,调用方法的变量保持活动但被调用的方法无法访问。

以类似的方式,变量位于范围并不意味着它必须包含有效的。这就是为什么@Daniel将nil放入变量中 - 您知道是否已在if的正文中创建了一个值,string的值不是nil

所以也许这就是你似乎在寻找的“动态”行为 - 你必须声明某种方式来引用值(变量),但你指出它是否是通过存储一些标记来创建的(nil在这种情况下)在变量中。