2015-04-06 114 views
1

的壽命我有一個的NSTextField並獲得它的內容,像這樣的NSString cStringUsingEncoding返回值

NSString *s = [textField stringValue] 

現在我想這個的NSString轉換爲我的獨立於平臺的C代碼可以處理的字符串。因此我在做:

const char *cstr = [s cStringUsingEncoding:NSISOLatin1StringEncoding]; 

我現在不明白的是這個「cstr」指針保持有效多久。蘋果文檔的cStringUsingEncoding說:

返回的C字符串是保證有效期至要麼 接收器被釋放,或直到當前內存被清空,先發生 。您應該複製C字符串或使用 getCString:maxLength:encoding:如果它需要在此時間之後存儲C字符串 。這個

兩個問題:

  1. 我想前面提到的 「接收器」 是由[文本字段stringValue的]返回的NSString。由於我不擁有這個NSString,我怎麼知道它何時會被釋放?假設這個NSString在NSTextField部件被釋放之前不會被釋放是否安全?

  2. 「直到當前內存被清空」是什麼意思?我根本不明白這一點。

當然,我可能只是繼續前進,使副本,但我想了解由cStringUsingEncoding返回的字符串指針的有效期。

我知道這裏有幾個類似的問題,但沒有人能真正回答我的問題,因爲在我的情況,NSString的所有者是的NSTextField控件,我不知道什麼時候這個小部件將釋放的NSString,或者如果它停留有效的部件本身的整個生命週期。

回答

1

我想前面提到的「接收器」是由[textField stringValue]

返回NSString是,在這種情況下,接收器是s

既然我並不擁有這個NSString如何我可以告訴我什麼時候能夠釋放?

你沒有。你應該將它存儲在一個實例變量,只要你需要保留s

它是安全的假設這NSString不會被釋放的NSTextField部件將被釋放之前?

沒有,因爲你不知道什麼或文本字段如何返回s

是什麼「直到目前的內存空」的意思準確?我根本不明白這一點。

好問題。也很難說,因爲你不擁有字符串或知道它的底層實現。說它是突變,不得不重新分配內存一個可變的字符串...

您可以確信您的安全,如果你copys,存儲複製到一個實例變量,然後使用複製來生成C字符串(或者只是複製C字符串)。

+1

謝謝,我有關於保留的另一個問題,但我認爲這是一個新的問題。 – Andreas

0

接收方確認意味着字符串s,並且當s被釋放時cstr的危險是明確的。我認爲短語「或直到當前內存被清空」是由ARC引入的文檔錯誤。它可以被解讀爲「或者直到執行一個ARC暗示的釋放」。

請參閱2010年的文檔quoted here作爲證據。我認爲作者可能正在尋找'autorelease pool'來更新文檔,並且正在抓住一個無害的,與ARC兼容的同義詞「或者直到當前的自動釋放池被清空」。我認爲放棄這種分離會更好。

無論如何,要麼控制NSString,要麼複製cstring。