Утечка памяти в CFStreamCreatePairWithSocketToCFHost - PullRequest
0 голосов
/ 20 января 2012

Я в процессе преобразования доступной библиотеки SKP_SMTP для реализации SMTP-клиента в моем приложении для iPhone.После долгой и трудной работы по исправлению ошибок и проверкам памяти я сузил проблемы до одной.Случается, что утечки памяти происходят при вызове CFStreamCreatePairWithSocketToCFHost (подтверждается инструментом Leaks в инструментах), что мне кажется странным как CFReadStreamRef параметры readStream и writeStream либо CFReleased на более поздней стадии, либо назначены соответствующему объекту NSStream через __ bridge_transfer (что в конечном итоге должно привести управление памятью потоков из CoreFoundation кARC).Я гуглил, но единственные решения, которые я нашел, - сбор мусора (явно недоступный в ARC): я что-то упустил или этого не должно произойти?Код следующий, спасибо большое

@implementation NSStream (SKPSMTPExtensions)

+ (void)getStreamsToHostNamed:(NSString *)hostName port:(NSInteger)port inputStream:  (NSInputStream **)inputStream outputStream:(NSOutputStream **)outputStream
{
    CFHostRef           host;
    CFReadStreamRef     readStream;
    CFWriteStreamRef    writeStream;

    readStream = NULL;
    writeStream = NULL;

    host = CFHostCreateWithName(NULL, (__bridge_retained CFStringRef) hostName);
    if (host != NULL) 
    {
        // Memory leak at this line: strange as readStream & writeStream are either   CFReleased or _bridge_transfered to ARC 
        (void) CFStreamCreatePairWithSocketToCFHost(NULL, host, port, &readStream,   &writeStream);
        CFRelease(host);
    }

    if (inputStream == NULL) 
    {
        CFRelease(readStream);
    } 
    else 
    {
        *inputStream = (__bridge_transfer NSInputStream *) readStream;
    }
    if (outputStream == NULL) 
    {
        CFRelease(writeStream);
    } 
    else 
    {
        *outputStream = (__bridge_transfer NSOutputStream *) writeStream;
    }

}

@end

1 Ответ

0 голосов
/ 24 января 2012

Я думаю, что это утверждение просачивается hostName:

host = CFHostCreateWithName(NULL, (__bridge_retained CFStringRef) hostName);

Вы должны использовать __bridge приведение, а не __bridge_retained приведение.

...