2009-12-14 182 views
3

有誰知道,如果下面的代碼可能是有問題的:的Objective-C:初始化變量爲零

NSString *addchar = nil; 

if (case1) 
addChar = [[firstname substringToIndex:1] capitalizedString]; 
else 
addChar = [[fullname substringToIndex:1] capitalizedString]; 

假設姓和全名不爲空或空。初始化NSString對象並將其設置爲'nil'會導致一些可能的問題?它似乎會導致我的應用程序凍結,但僅限於少數用戶,並且僅限於那些用戶,但它與任何輸入字符串或空字符串沒有任何關係。所以我試圖孤立的問題,但我不知道

NSString *addChar; 

NSString *addChar = nil; 

感謝之間的差異。

回答

7

兩種形式都完全可以接受。你遇到的問題在別處。我建議使用儀器進行一些代碼分析以找出發生此問題的位置。

+0

謝謝。這是令人沮喪的,因爲我無法自己再現問題(它與我有的應用程序一起),它隻影響一個小組,並且不會導致崩潰......它只會掛起......所以它不會生成一個崩潰日誌。所以我不知道如何去追蹤它。即使蘋果的工程師似乎也無法找到問題。 – 2009-12-14 22:06:43

+0

如果此代碼在靜態方法內運行,這有什麼關係嗎? – 2009-12-15 18:21:10

1

這裏沒有什麼區別,因爲您在代碼中沒有讀取addChar。此外,如果您沒有明確地執行(取決於addChar的聲明的範圍),編譯器有時可能會爲您初始化addCharnil

this place查看相關問題。

+0

什麼編譯器將它初始化爲未定義。在實踐中,這將是隨機垃圾。 – Chuck 2009-12-14 21:50:55

+0

是的,我意識到我的表述並不完全清楚......它實際上取決於變量的範圍(有些情況下它會保證被初始化)。 – Romain 2009-12-14 21:52:45

5

如果沒有零初始化器,在某些情況下,您的變量可能會被垃圾初始化(無論以前是否在內存空間中)。關於哪些類型的變量(基於範圍,靜態存儲等)有自動爲你自動初始化的特定規則,但我總是發現,明確初始化所有變量而不是記住這些規則會更容易。

這就是說,因爲你的if語句的兩個分支都會打斷addChar的任何以前的值,所以不應該出現任何可以看到無效值的情況。但它肯定不會傷害任何顯式初始化爲零,並且如果未來的維護者出現並更改代碼路徑,您可能會發現初始化程序可以節省您的時間!

2

如果變量未被初始化,則應始終初始化爲零。

您可以發送消息到零,它們將被忽略。

NSString * str = nil; 
NSLog(@"%@", [str description]); 

輸出:

2009-12-15 08:59:03.352 x[11775] (nil) 

當然我並不需要調用description明確,我只是演示調用nil