2012-10-19 76 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); 

我希望它能清除你。