2009-09-02 75 views
1

我很難理解NSLog在代碼運行時報告「狗」的原因。我瞭解保留計數和dealloc e.t.c.我錯過了什麼簡單的事情?對象不釋放目標C

NSString *newFoo = @"dog"; 
[newFoo release]; 
NSLog(newFoo); 
+0

感謝您的回答。我只是試圖抓住Objective-C,我正在寫這個,看看我是否明白髮生了什麼。 – 2009-09-02 18:53:27

+0

@Spyker您應該將答案標記爲已接受:-) – chakrit 2009-09-02 18:55:15

+1

爲什麼有這麼多人說「我不知道Objective-C但是」,然後對其實施做出假設?如果你沒有確定的答案,回答是沒有意義的。按鈕顯示「發佈您的答案」,而不是「發佈您的猜測」或「發佈您的假設」。 – dreamlax 2009-09-03 00:06:06

回答

7
[@"String Literal" release]; 

是一個noop;

NSString *literal = @"String Literal"; 
[literal release]; 

也是noop。這是只有字符串文字的情況;你不應該在其他地方期待這種行爲。 (這是說;即使你告訴釋放的對象,它只是不)

+0

確切的說,儘管你可能比我更清楚地表達了它。 – 2009-09-02 18:53:28

+2

而且編程時你絕對不應該考慮這種行爲。保留數是一個實現細節,您應該關心的唯一事情就是平衡您的保留與發佈。 – bbum 2009-09-02 22:06:05

-1

您解除分配的,的內存塊指針的指向,但數據仍然存在

釋放它不會自動清零內存的那部分。

所以,你仍然可以讀出來就好的數據,但它只是可能會被別的東西了線被搶購(分配)......只是不是現在。

我不是通過貿易的ObjC編碼器而是因爲它兼容C這就是我從我的C經驗猜測。

+0

指針未被釋放 – Mark 2009-09-02 18:47:57

+0

僅針對字符串文字的特殊情況。將其更改爲任何其他類和任何其他初始化方案和chakrit是100%正確的。 – Randolpho 2009-09-02 19:49:38

+0

一個缺陷,你會得到一陣降低成績。猜猜這就是「社區」的含義。 – chakrit 2009-09-04 04:44:42

5

我相信這是因爲@「狗」被編譯器有效地視爲常量。它創建了NSString的一個子類(它是一個類集羣),它在應用程序的整個生命週期中持續存在。

了明確的答案,基本上是和我一樣剛發現this question

-1

雖然對象可能釋放(不知道的OBJ-C內部是怎樣處理字符串,一些語言基本上緩存字符串)您在發佈後還沒有在newFoo的記憶中寫下任何新內容。存儲字符串的內存保留其內容,但可以隨時覆蓋。

newFoo仍然指向內存中的同一個地址,但該內存可能成爲在任何時候任何東西。

確實沒有指向潛在污垢記憶的方法是在發佈後將newFoo設置爲nil

2

字符串文字是一種特殊情況.. http://thaesofereode.info/clocFAQ/

但一般不使用垃圾收集只是堅持一些簡單的規則假設..

http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

更貼切..當你需要它時保留一個物體 - 完成後用釋放來平衡它。如果您沒有創建或保留它,則不需要釋放它。

發送-release一個對象不像釋放內存,它只是你用它做信號。它可能仍然在或可能不在。你無法知道,你不需要知道,而且你不應該試圖找出它是否在其他地方使用,如果聰明的蘋果代碼已經決定緩存它,如果它是一個單身人士,等等。

它可能仍然是有效的,但是當你發佈了發佈版時,你已經有效地說「我完成了」而不是「回收這個內存」。