2016-04-14 5 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 (который асинхронный) не заканчивается, или это локальное для отправки, и уничтожено, когда функции выхода?

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

+0

Когда вы говорите «освобожден после того, как вы вернетесь из функции», на какую функцию вы ссылаетесь? – Ravi

+0

В этом случае функция «отправить» – Shripada

+0

writeData может не завершиться после завершения отправки. Я не показывал его в примере кода, но writeData имеет делегат async 'didWriteWithTag'. Будет ли bufferCopy сохранен до тех пор, пока делегат не будет вызван или не будет освобожден при отправке? – Ravi