考虑以下Objective-C代码:
@interface ClassA : NSObject {
}
-(void) printVal;
@end
@implementation ClassA
-(void) printVal {
int val;
NSLog(@"%i", val);
}
@end
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
ClassA* cA = [[ClassA alloc] init];
[cA printVal];
[cA printVal];
[cA printVal];
[pool drain];
return 0;
}
为什么输出:
2012-11-29 22:12:06.586 TestOne[20266:903] 0
2012-11-29 22:12:06.587 TestOne[20266:903] 32767
2012-11-29 22:12:06.588 TestOne[20266:903] 32767
换句话说,为什么val
在重新声明时不会重新初始化为0,为什么每次调用该方法时它都会收到值32767
?
答案 0 :(得分:3)
那是垃圾值。
用一些值初始化它。
编辑:
存储类说明符的默认值为
表示自动垃圾价值。
表示静态 - 。
表示global / extern-0;
用于寄存器垃圾。
在你的情况下它是自动的。
OHHH !!!我想回答你的第二部分:(
为什么最初它是0,后来是32767。
你正确地指出了这个链接,现在没有必要在这个答案中解释。我该怎么办才能参考该链接。
答案 1 :(得分:1)
在Objective-C中,the only guarantee you have is that an int will be at least 32-bits wide。这可能会解释为什么它不是0.至于为什么它是32767,我没有最模糊,但32768是2的幂,所以这可能提供答案的线索。
答案 2 :(得分:1)
除非您初始化本地自动变量,否则不会初始化它们。不能假设它们具有任何特定价值。实例变量,静态变量和全局变量初始化为0,但不是像这样的普通本地变量。在打算读取其值
之前,您需要自己初始化它答案 3 :(得分:0)
在堆栈上声明值不会初始化它。它只是为它分配空间。无论在记忆中发生什么价值,你都会看到印刷的价值。如果您改为写道:
-(void)printVal
{
int val = 0;
NSLog (@"%i", val);
}
然后每次都应该打印0。