简单的Objective-C概念

时间:2012-10-19 10:24:56

标签: iphone objective-c ios

我只是想知道这种奇怪的行为当我在.h文件中声明NSString *temp并在viewDidLoad方法中尝试打印它是NSLog(@"%@,temp")时,它显示为null对我而言,当我在NSLog(@"%@",temp)之前宣布这个变量时,我的应用程序正在崩溃说不好访问,有人可以向我解释这个吗?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

NSString *str;

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

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

答案 2 :(得分: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);

我希望它能让你感到清醒。