1

У меня есть функция, которая использует dispatch_asynciphone: управление памятью с dispatch_async

- (void)_handleMessage:(id)message{ 
    dispatch_async(_callbackQueue, ^{ 
     [self.delegate webSocket:self didReceiveMessage:message]; 
    }); 
} 

Я называю эту функцию как этот

NSString *str = [[NSString alloc] initWithData:frameData encoding:NSUTF8StringEncoding]; 
[self _handleMessage:str] 
//[str release]; <== Can I release str here??? 

Мой вопрос

  • Где я могу выпустить переменная str?

Обычно я могу освободить только после вызова [self _handleMessage:str], но так как dispatch_async выполняет оператор

[self.delegate webSocket:self didReceiveMessage:message]; 

асинхронно (возможно, через какое-то время), я рассматриваю плохую ошибку доступа. Каков наилучший способ управления памятью в этом случае?

Если вы все еще возникают сомнения, я старая школа парень, а не с помощью ARC

ответ

7
//[str release]; <== Can I release str here??? 

Насколько я понимаю, вы можете освободить переменную там. Indeed:

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

Это означает, что блок сохранит message объект, который вы используете в нем, и это освободит его, когда сделано, так что вы можете свободно отпустить его после вызова _handleMessage.

+0

Как окончательный ответ, поскольку он получает .. Спасибо sergio .. Примите, как только stackoverflow позволит мне это сделать. – Krishnabhadra

+1

@ Krishnabhadra: рад помочь ... – sergio

Смежные вопросы