2012-08-30 139 views
1

cStringUsingEncoding:儘管它返回一個動態分配的C字符串(從它的文檔中),但它返回一個「const char *」。那麼,const在這裏的目的是什麼?我們可以簡單地通過強制轉換爲char *來修改返回的C字符串。爲什麼cStringUsingEncoding:返回const char *而不是char *?

cStringUsingEncoding:

返回的C字符串被保證是唯一有效,直到該 接收機被釋放時,或直到當前自動釋放池被清空, 以先到者爲準。

我認爲庫遵循const指針的常見做法;預計不會被修改或發佈。

從Objective-C運行時;

const char * object_getClassName(id obj) - 沒有指定關於返回的字符串。

char * method_copyArgumentType(方法方法,無符號整型索引) - 必須使用free()釋放字符串。 (可能是它的建議,因爲它返回一個副本。)

回答

4

常見的模式是,你不應該修改你不擁有的緩衝區。 const文件和(稍微)執行此操作。

至於cStringUsingEncoding:,文檔說只有收到它的NSString或當前自動釋放池的持續時間內,返回的緩衝區纔有效。這意味着你不要擁有返回的緩衝區,因爲你不會釋放它。

你的最後兩個從運行時的例子遵循相同的約定:

  • const char * object_getClassName(id obj)

    不告訴你,你應該釋放緩衝區,並且名稱不包含任何跡象表明,你擁有緩衝區。所以你不要free()它,你不修改它。

  • char * method_copyArgumentType(Method method, unsigned int index)

    該文檔明確地告訴你,你應該釋放緩衝區和函數名稱中包含搬弄是非copy這也意味着你自己的緩衝區。因此你可以修改所有你想要的,並且必須free()它。

+0

所以它是關於const正確性的;可修改性和大多數所有權,我說得對嗎? – lockedscope

+0

是的,根據其可修改性,代碼是常量正確的,由其所有權決定。 –

+0

但是我們如何從所有權得出關於可修改性的結論?(如果我們討論的是內存中的規則,則可修改性和所有權afaik之間沒有關係。) – lockedscope

2

事情是,結果是常量,因爲

  • 修改它不會改變字符串本身,而CString的真的只是爲了是字符串的不同表示
  • 只要字符串不更改,它可能會一次又一次地返回相同的cString。

除此之外,即使實現沒有強制執行或者要求這是界面設計者可以做的事情,也可以聲明結果爲const,也許是因爲他希望以這種方式對待它。在「const」有用的情況下,它會打開路徑來優化事物。

+0

對於第一種選擇,我們從DOCO和方法簽名:字符串是不同的表示理解,但如果方法調用與內部表示的相同的編碼(或某些其他原因),那麼它可能返回的參考內部NSString緩衝區。因此它在概念上必須是不可修改的,對嗎? – lockedscope

+0

你究竟想用這個來表達什麼:「修改它不會改變字符串本身,而cString實際上只是表示字符串的不同表示」?只有當我們在你的下一個陳述中考慮它時,它纔有意義。否則,當我們單獨考慮時,我們可能會問:如果它是一個不同的表示,爲什麼它需要是const? – lockedscope

相關問題