我只是想知道这种奇怪的行为当我在.h文件中声明NSString *temp
并在viewDidLoad
方法中尝试打印它是NSLog(@"%@,temp")
时,它显示为null对我而言,当我在NSLog(@"%@",temp)
之前宣布这个变量时,我的应用程序正在崩溃说不好访问,有人可以向我解释这个吗?
答案 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);
我希望它能让你感到清醒。