2016-04-14 40 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