2010-04-29 27 views
4

我有點新的Objective-C,我不知道該代碼是正確的內存管理。正確的內存管理爲[字符串UTF8String]

const unsigned char * data =(const unsigned char *) [string UTF8String]; 

當我打電話給數據時,我得到一個錯誤。這次通話後我需要清理嗎?

回答

10

編號「UTF8String」不包含單詞alloc,copy,retaincreate。因此,您不對該內存負責。

請注意,如果您希望在發佈string後仍然需要這些數據,則應將其複製;通過合同,你對該記憶沒有任何責任,但也不能保證它會超出賦予給你的對象的範圍。

+1

當NSString被釋放時,C字符串被釋放。 (或者物體的內部狀態改變。) – 2010-04-29 20:35:04

+1

這是危險的建議。很多處理C指針的方法都需要你釋放內存。 alloc複製保留規則適用於對象。 – Chuck 2010-04-29 20:36:13

+0

@Chuck:我已經添加了關於「創建」的註釋,它也會照顧Core Foundation對象。你能給出一個方法的例子,需要調用者釋放該規則未涉及的內存嗎? – 2010-04-29 20:37:40

2

你不需要free它。

在Cocoa中,如果某個方法不包含單詞allocinitcopy,那麼您不擁有從該方法返回的對象。

-UTF8String實際上到您所呼叫它的NSString對象的cstring表示。當對象的狀態改變時,UTF8String也會改變。

+0

沒有從此方法返回的對象,因此對象的內存管理規則無關緊要。 – Chuck 2010-04-29 20:46:35

+0

我一直認爲會發生什麼是使用'-dataUsingEncoding:NSUTF8StringEncoding'將字符串轉換爲NSData對象,然後結果是來自'NSData'對象的'bytes'方法。我從來沒有打擾過嘗試看看引擎蓋下,所以我可能是錯誤的。 – dreamlax 2010-04-29 20:50:52

2

正如documentation中所述,它會以與自動釋放對象相同的方式自動釋放。

0

從技術上講,free()用於從堆中移除使用malloc()分配的內存。 malloc()未用於分配內存。請記住,objective-c帶有擴展名。 數據變量將保留在基於c語言'範圍'規則的內存中。