簡體   English   中英

NSString和Objective-C內存管理ARC

[英]NSString and Objective-C Memory Management ARC

在編寫Objective-C項目時,我有些困惑。 ARC已打開。 這是一個示例代碼:

NSString *foo = [[NSString alloc] initWithUTF8String:"This is a C string."];

// Use foo here...

foo = @"This is an ObjC string."

這是我的問題:

  1. 我是否需要在initWithUTF8String:方法中以'\\ 0'顯式終止C字符串,還是可以省略NULL終止符?

  2. 當我將foo用作指針並為其分配新的Objective-C字符串時,是否存在任何內存泄漏? 為什么?

  3. 如果我將NSString更改為其他類,例如NSObject或自己的類,問題2有什么區別嗎? (初始化一個對象,然后直接將其他值重新分配給它。)

謝謝!

  1. 您必須具有空終止符。 在文檔中:“ bytes-以UTF-8編碼的NULL終止的C字節數組。此值不能為NULL。”
  2. 不會。編譯器將插入前一個值的隱式釋放,並保留新值,因為您使用(隱式)強語義聲明了foo。 在文檔中:“ __ strong是默認值。只要有很強的指針指向對象,該對象就會保持”活動”狀態。”
  3. 一般來說,沒有。
  1. 不需要顯式\\ 0,因為在C中(因此在目標C中),引用的字符串文字被編譯器隱式終止為空。 這是一個類似的問題。

以null終止符結尾的字符串文字是否包含額外的null終止符?

  1. 沒有內存泄漏。 配置了ARC的編譯器將生成代碼,以在分配新字符串之前釋放被引用的第一個字符串。

  2. 沒變。 如果類型不兼容,則可能會收到編譯時警告。

對於第一個問題,Apple的官方文檔告訴我的是:

返回一個字符串,該字符串是通過從給定的UTF8編碼字節的C數組復制數據而創建的。

  • (id)stringWithUTF8String:(const char *)bytes參數bytes一個以NULL終止的C字節數組,采用UTF8編碼。

但是由於字符串文字默認情況下為NULL終止(如@TomSwift指出的那樣),可以省略它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM