4

方法调用完成后,方法中声明的变量会被删除吗?即,如果我有方法“someMethod”并且每次调用它时我想从堆栈属性返回不同的 NSString,该方法将返回堆栈上的下一个对象,还是会保持返回第一个索引,因为 x 在方法调用结束。我知道在函数调用后是否会删除 C 中的变量,在目标 c 中是否相同?对变量 x 使用单独的属性会出现这个问题吗?谢谢

(Double) someMethod{
int x;
[self.stack objectAtIndex:x];
x++;
}

阅读评论后,我尝试创建一个属性来替换 x,这就是我写的内容,但我收到一条错误警告,指出““_location”的本地声明隐藏实例变量”这是什么意思?

@property (nonatomic) int location;
@synthesize location=_location;

-(int) location{
    if(!_location){
        int _location = 0;
     //warning is here 
    return _location;
     }
_location++;
return _location;

}

 (Double) someMethod{
int x;
[self.stack objectAtIndex:self.location];
x++;
}
4

3 回答 3

4

方法调用完成后,方法中声明的变量会被删除吗?

是的

目标 C 方法是在 C 函数的“顶部”实现的,因此适用相同的规则。特别是,您的代码表现出未定义的行为(读取未初始化的变量)。

要解决此问题,请添加一个实例变量x来代替您的代码片段当前声明 的自动变量。


自动是“堆栈”变量的“官方”名称,即您在方法/函数中声明的变量。

于 2012-08-01T00:47:09.330 回答
1

是的,局部变量的生命周期仅限于封闭函数的执行时间( blocks除外,但在这种情况下您没有使用它们)。

如果您x想在调用someMethod.

于 2012-08-01T00:46:55.470 回答
1

回答您有关警告的问题...

这只是说当您在方法 location() 中声明时

int _location = 0;

此局部变量与您之前创建的属性同名

@syntenshize location = _location

因此(对于程序员来说)知道他现在使用的是哪一个会变得很困惑。

编译器将理解 if _location 内部是一个 int ...,而 if _location 外部是您的属性。

于 2012-08-01T03:03:15.823 回答