我只是想知道这种奇怪的行为当我声明NSString *temp
in .h 文件并在viewDidLoad
方法中尝试打印它时NSLog(@"%@,temp")
,它向我显示 null velue 但是当我在NSLog(@"%@",temp)
我的应用程序崩溃之前声明这个变量说访问不正确时,谁能给我解释一下?
3 回答
声明为实例变量的变量默认设置为 0,但局部变量不是,即它们通常包含无效的数据/指针。访问它们时,您会遇到崩溃。
编辑:您可以尝试使用 int 值 - 它们不会崩溃但会显示它们的值。或者转储对象的指针值。
如果您将 NSString 声明为 ivar,则默认情况下它将具有 nil 值。所以NSLog(@"%@", temp)
会显示为空。但是局部变量没有得到任何默认初始值,而是包含垃圾值。因此,在这种情况下NSLog(@"%@", temp)
,尝试访问无效地址,从而发生错误访问。您可以在调试器中检查这一点。ivar 将显示 nil 但本地字符串将显示垃圾值。
编辑: ivar 表示类的实例成员变量。@interface
您在块中声明这些变量。它们与在任何类和方法之外声明的全局变量不同。全局变量可以从代码的任何地方访问,但实例变量可以在类内部访问(当然,除非您已经定义了 setter/getter)。关于崩溃的事情是,如果您尝试访问不属于程序的任何内存,那么它将崩溃。未初始化的变量包含垃圾值。
NSString *str;
考虑这个未初始化str
的 . 说它包含垃圾值0x130154d0
。因此,当您编写NSLog(@"%@", str)
它时,它会尝试访问对0x130154d0
程序无效并会崩溃的对象。
如果将此变量声明为类 (ivar) 的实例成员变量,则编译器已将其初始化为nil
. 在这种情况下,您将看到null
而不是崩溃。
之所以会发生这种情况,是因为 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);
我希望它能清除你。