2010-08-04 60 views
1

,我有以下的代碼查詢]。有關的NSString對象和內存管理

dateString = tempString;

[tempString release]; (@「datstring和tempstring的保留計數是%d和%d」,[dateString retainCount],[tempString retainCount]);

的NSLog(@ 「%@和%@」,dateString,tempString)

現在它打印tempString的保留計數爲1(也dateString保留計數= 1),即使我在該行釋放它之前。此外,打印兩個字符串的NSlog語句不顯示任何內容。我假設這是因爲,由於我的代碼,dateString指向tempString的位置和tempString已被釋放,NSlog將無法打印字符串。但是,爲什麼tempString = 1的保留計數?

如果我替換線

dateString = tempString;

dateString = [的NSString stringWithString:tempString];

然後NSlog語句打印dateString和tempString的值,並顯示它們的保留計數爲1.當我在前一行釋放tempString的值時,打印的tempString值如何?

回答

0

當您發佈發佈到tempString objc運行時只需調用dealloc。僅僅因爲一個對象已經發送了dealloc並不意味着它在堆上的數據立即被銷燬。它後來被標記爲銷燬。

2

閱讀iphone文檔:

你不應該使用retainCount到 調試內存管理問題。

由於jamapag指出release只是告訴運行時運行dealloc指該內存被標記爲可重複使用的不是它已被清除。對於retainCount爲1的對象,運行時通常不會減少dealloc之後的retainCount值。

要注意的另一件事是,你不應該發送消息發佈的對象,因爲你正在與retainCount做你一定會得到一些意想不到的行爲