2016-04-14 45 views
0

GCDAsyncSocket的文檔說可能更改的可變數據在傳遞給寫函數之前應該被複制。GCDAsyncSocket - 如何編寫可變數據?

在下面的代碼:

func send(buffer: NSMutableData) { 
    let bufferCopy = NSData(data: buffer) 
    socket.writeData(bufferCopy, withTimeout: -1, tag: 0) 
} 
  1. 是調用NSData複製的緩衝區的正確方法?
  2. bufferCopy保留在內存中,直到writeData(即async)完成,或者是本地發送,並在函數退出時銷燬?

回答

1

1.是否調用NSData正確的方式來複制緩衝區?

是,它將字節複製到一個新的數據對象

2.將bufferCopy保留在存儲器內,直到寫數據(這是異步)結束時,或者是它的本地發送,並摧毀當函數退出?

是的,它會一直保留到writeData結束。同樣,如果writeData是同步的,它將在從send函數返回時被釋放,因爲從外部沒有任何其他強引用。如果WriteData是一個異步調用,一旦調用完成,數據將被釋放,因爲不會有任何強引用,因爲控制會從發送和WriteData異步調用中發出。所以如果這個調用是異步的,那意味着這個調用需要有一個強大的緩衝區拷貝。

+0

當你說「從函數返回時釋放」,你指的是哪個函數? – Ravi

+0

在這種情況下,「發送」功能 – Shripada

+0

發送完成後writeData可能無法完成。我沒有在代碼示例中顯示它,但writeData有一個異步委託「didWriteWithTag」。在調用委託之前是否會保留bufferCopy,或者在發送完成後解除分配? – Ravi