2011-01-11 303 views
1

我已經在.hiPhone發佈問題

@property (nonatomic, copy) NSString *username; 

然後將以下代碼,用戶名是這樣分配的,當用戶在一個TextField輸入文本:

self.username = textField.text; 

,然後在dealloc方法我稱之爲發佈:

NSLog(@"%d",[username retainCount]); 
[username release]; 
NSLog(@"%d",[username retainCount]); 

但在控制檯它打印:

2011-01-11 23:09:52.468 IAPP [2527:307] 1
2011-01-11 23:09:52.480 IAPP [2527:307] 1

什麼問題?

感謝

回答

3

對象不會立即釋放。 可能在對象真正釋放之前,必須有一個運行循環週期。
但是,調用retainCount確實是一件很平常的事情。請閱讀原因:When to use -retainCount?

編輯:@ kris-van-bael對此答案發表了評論 - 正確 - 基於文檔,這是不正確的。所以我必須清楚地說明,我在這裏寫的是基於在iOS模擬器上測試這個問題的 - 並不是它應該如何運作10。不過似乎下面的代碼將沒有錯誤運行:地方在你的代碼寫

@interface Test : NSObject { } 
@property (retain, nonatomic) NSString *test; 
@end 

@implementation Test 
@synthesize test; 
@end 

然後:

Test* t = [[Test alloc] init]; 
t.test = @"Test1"; 

NSLog(@"%@", t.test); 

[t release]; 

t.test = @"Test2"; 

NSLog(@"%@", t.test);  

這(可惜的)將在iOS模擬器沒有錯誤運行(但是執行它調試器崩潰一步一步),所以在iOS中取消分配對象顯然有一些技巧。

+0

這是不正確的,'autorelease被推遲'直到事件處理結束,但'釋放'立即執行。 – 2011-01-11 22:34:20

+0

是的。這是理論,在所有情況下都應該是真的。然而,我剛剛創建了一個小型iOS應用程序(在模擬器中測試過),並且在釋放我的Test類的實例後,我仍然能夠獲取我的屬性值。看來這個框架在調用dealloc的時候會拖延一些時間......如果你一步一步地執行這個程序,你會得到一個正確的BAD ACESS,儘管(嘗試它)......) – Moszi 2011-01-11 22:42:09

6

發佈後,該對象被破壞,所以叫「retaincount」第2個時間不確定的行爲

3

當您鬆開在第一時間,保留計數爲1。由於內存即將被釋放,沒有「需要」減少保留計數,因此底層代碼可能會簡單地跳過遞減步驟並釋放內存。

當您第二次查看保留計數時,您正在查看已釋放的內存,這是不安全的並可能返回任何值。由於其緊接在 release之後,內存可能尚未分配給其他內容,但不應該無論如何都不要訪問它。

4

What is the problem?

的問題是,你正在使用retainCount和期待一個有意義的結果。

不要叫retainCount

When to use -retainCount?

上面有一些不錯的細節。所以在這裏所做的其中一個答案:

https://stackoverflow.com/questions/4580684/common-programming-mistakes-for-objective-c-developers-to-avoid


請注意,您可以設置MallocScribble環境變量,這將導致分配的內存來填充在分配和0xAA字節,在釋放0x55的字節。面對這一點,你的第二個電話retainCount會崩潰。