2012-10-19 78 views
-4

我只是想知道这种奇怪的行为。当我声明在.h文件中,并在viewDidLoad方法NSString *temp尝试打印是NSLog(@"%@,temp"),它显示空velue给我,但是当我宣布这变数前NSLog(@"%@",temp)我的应用程序越来越崩溃说不好访问,任何人都可以解释这一点给我?简单的Objective-C概念

+0

请张贴'.h'文件的declration。 – rckoenes

+0

向我们展示一些代码。 – Martol1ni

+0

@reckoenes ViewController:UIViewController {0} {0} {0} {0} NSString * check; } – IOSCODER

回答

1

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

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

+0

你能告诉我为什么它已经成为实例变量通过在.h文件中声明或在外部功能 – IOSCODER

+0

我*猜*是你把它放入'@interface .... @end'部分,但是你没有提供你的代码。 – Eiko

+0

@Anshul这是一个概念,如果你在'.h'中声明了任何变量,它就会成为默认的iVar.so如果你想了解更多细节知识,你应该看看这个链接https://developer.apple.com/library /mac/#documentation/Cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html – Kamarshad

1

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

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

NSString *str; 

考虑这个未初始化的str。假设它包含垃圾值0x130154d0。所以当你写NSLog(@"%@", str)它试图访问对象0x130154d0这是无效的程序,并会崩溃。

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

+0

它不是那么它会崩溃,或者你宣布它为iVar或Localvar.i已检查 – Kamarshad

+0

什么是伊娃,以及如何在.h中声明它使它成为伊娃? – IOSCODER

+0

@Anshul iVar(实例)表示它们可以在'.m'内部进行访问,没有任何限制。他们将全局变量视为相应的类 – Kamarshad

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); 

我希望它能清除你。