GCDAsyncSocket — как записать изменяемые данные?

В документации для GCDAsyncSocket говорится, что изменяемые данные, которые могут измениться, должны быть скопированы перед передачей их в функцию записи.

В следующем коде:

func send(buffer: NSMutableData) {
    let bufferCopy = NSData(data: buffer)
    socket.writeData(bufferCopy, withTimeout: -1, tag: 0)
}
  1. Является ли вызов NSData правильным способом копирования буфера?
  2. Будет ли bufferCopy храниться в памяти до тех пор, пока writeData (то есть async) не завершится, или оно будет локальным для отправки и будет уничтожено при выходе из функции?

person Ravi    schedule 14.04.2016    source источник


Ответы (1)


1. Является ли вызов NSData правильным способом копирования буфера?

Да, он скопирует байты в новый объект данных

2. Будет ли bufferCopy сохраняться в памяти до тех пор, пока не завершится запись данных (которая является асинхронной), или она будет отправлена ​​локально и уничтожена при выходе из функции?

Да, он будет сохранен до завершения записи данных. Кроме того, он будет освобожден, как только вы вернетесь из функции отправки, поскольку нет никаких других сильных ссылок на него извне, если writeData является синхронным. Если WriteData является асинхронным вызовом, после завершения вызова данные будут освобождены, поскольку на них не будет строгой ссылки, поскольку управление будет исходить как от отправки, так и от асинхронного вызова WriteData. Поэтому, если этот вызов асинхронный, это означает, что этот вызов должен иметь сильную ссылку на bufferCopy.

person Shripada    schedule 14.04.2016
comment
Когда вы говорите освобождён после возврата из функции, какую функцию вы имеете в виду? - person Ravi; 14.04.2016
comment
В этом случае функция «отправить» - person Shripada; 15.04.2016
comment
writeData может не закончиться после завершения отправки. Я не показывал это в примере кода, но в writeData есть асинхронный делегат didWriteWithTag. Будет ли bufferCopy сохраняться до тех пор, пока делегат не будет вызван, или будет освобожден после отправки? - person Ravi; 15.04.2016
comment
Если WriteData является асинхронным вызовом, то он должен удерживать буфер со строгой ссылкой. Как только это будет завершено, сильного рефери больше не будет, и он будет освобожден. Также обновил ответ - person Shripada; 15.04.2016
comment
В документации для GCDAsyncSocket говорится, что writeData сохраняет буфер, поэтому похоже, что буфер будет в порядке на время вызова. - person Ravi; 16.04.2016