-4

我只是想知道这种奇怪的行为当我声明NSString *tempin .h 文件并在viewDidLoad方法中尝试打印它时NSLog(@"%@,temp"),它向我显示 null velue 但是当我在NSLog(@"%@",temp)我的应用程序崩溃之前声明这个变量说访问不正确时,谁能给我解释一下?

4

3 回答 3

1

声明为实例变量的变量默认设置为 0,但局部变量不是,即它们通常包含无效的数据/指针。访问它们时,您会遇到崩溃。

编辑:您可以尝试使用 int 值 - 它们不会崩溃但会显示它们的值。或者转储对象的指针值。

于 2012-10-19T10:28:31.177 回答
1

如果您将 NSString 声明为 ivar,则默认情况下它将具有 nil 值。所以NSLog(@"%@", temp)会显示为空。但是局部变量没有得到任何默认初始值,而是包含垃圾值。因此,在这种情况下NSLog(@"%@", temp),尝试访问无效地址,从而发生错误访问。您可以在调试器中检查这一点。ivar 将显示 nil 但本地字符串将显示垃圾值。

编辑: ivar 表示类的实例成员变量。@interface您在块中声明这些变量。它们与在任何类和方法之外声明的全局变量不同。全局变量可以从代码的任何地方访问,但实例变量可以在类内部访问(当然,除非您已经定义了 setter/getter)。关于崩溃的事情是,如果您尝试访问不属于程序的任何内存,那么它将崩溃。未初始化的变量包含垃圾值。

NSString *str;

考虑这个未初始化str的 . 说它包含垃圾值0x130154d0。因此,当您编写NSLog(@"%@", str)它时,它会尝试访问对0x130154d0程序无效并会崩溃的对象。

如果将此变量声明为类 (ivar) 的实例成员变量,则编译器已将其初始化为nil. 在这种情况下,您将看到null而不是崩溃。

于 2012-10-19T10:31:08.897 回答
1

之所以会发生这种情况,是因为 ivars 默认根据它们的类型初始化为 0 = nil = NULL。自动地。另一边的局部变量需要先初始化。

我想,你是这样做的。

  NSString* myName;
  //in this case it'll give the warning VARIABLE "myName" IS UNINITIALIZED WHEN USED HERE.
  NSLog(@"%@",myName)

当您分配某些nil或任何其他值时,它不会崩溃。所以你应该这样做。

  NSString* myName= nil;
  NSLog(@"%@",myName);

我希望它能清除你。

于 2012-10-19T10:31:42.523 回答