Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone CFStreamCreatePairWithSocketToCFHost中的内存泄漏_Iphone_Objective C_Ios_Memory Leaks_Automatic Ref Counting - Fatal编程技术网

Iphone CFStreamCreatePairWithSocketToCFHost中的内存泄漏

Iphone CFStreamCreatePairWithSocketToCFHost中的内存泄漏,iphone,objective-c,ios,memory-leaks,automatic-ref-counting,Iphone,Objective C,Ios,Memory Leaks,Automatic Ref Counting,我正在转换可用的SKP_SMTP库,以便在我的iPhone应用程序中实现SMTP客户端。经过一段漫长而麻烦的bug修复和内存检查工作,我已经将问题缩小到只有一个。调用CFStreamCreatePairWithSocketToCFHost(由Instruments中的泄漏工具证明)时发生内存泄漏,这对我来说似乎很奇怪,因为CFReadStreamRef参数readStream和writeStream在稍后阶段被释放,或者通过\uuuu桥接\u传输分配给相应的NSStream对象(这将最终将流内存

我正在转换可用的SKP_SMTP库,以便在我的iPhone应用程序中实现SMTP客户端。经过一段漫长而麻烦的bug修复和内存检查工作,我已经将问题缩小到只有一个。调用CFStreamCreatePairWithSocketToCFHost(由Instruments中的泄漏工具证明)时发生内存泄漏,这对我来说似乎很奇怪,因为CFReadStreamRef参数readStreamwriteStream在稍后阶段被释放,或者通过\uuuu桥接\u传输分配给相应的NSStream对象(这将最终将流内存管理从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

我认为这句话泄露了主机名:

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

你应该使用
\u桥
演员阵容,而不是
\u桥
演员阵容。

几年后如何注意你的答案:)…谢谢rob