2013-10-15 43 views
3

我想寫一個代碼來創建NSMutableData從malloced緩衝區。我使用freewhendone = YES
1)它創建NSData後訪問緩衝區時出錯(在下面的代碼中的memset中)
2)mableced緩衝區指針和[數據字節]指針是不同的。NSMutabledata byteswithnocopy問題

這些有什麼解釋嗎?

UWORD8 *rgb_buffer = malloc(u4_stride * u4_height * 3); 

NSMutableData *rgbData = [NSMutableData dataWithBytesNoCopy:rgb_buffer 

                length:(u4_stride * u4_height * 3) 

               freeWhenDone:YES]; 
memset(rgb_buffer, 0, (u4_stride * u4_height * 3)); 
+0

您很可能在ARC中運行,並且在memset之後沒有使用rgbData對象;因此,它可能會提早釋放對象,從而釋放rgb_buffer。請參閱http://blog.bignerdranch.com/296-arc-gotcha-unexpectedly-short-lifetimes/ – iccir

回答

3

Binary Data Programming Guide

NSMutableData響應dataWithBytesNoCopy:長度:,但字節被複制無論如何和 緩衝器被立即釋放。

它給出了一個錯誤中創建的NSData後訪問緩衝器。(在memset的在下面的代碼)

緩衝器被立即釋放。

mableced緩衝區指針和[數據字節]指針是不同的。

NSMutableData創建字節副本。

+0

'如果您希望字節在對象發佈時不被複制或釋放,則可以使用dataWithBytesNoCopy:length: freeWhenDone:或initWithBytesNoCopy:length:freeWhenDone:通過NO作爲freeWhenDone:參數傳遞的方法。' 這就是說,使用這種方法字節不應被複制。當我嘗試freewhendone = NO時,memset不會給段錯誤,但指針仍然不同。 –

+1

NSMutableData也響應這些方法,但無論如何都會複製字節,並立即釋放緩衝區。 –