Iphone CFStreamCreatePairWithSocketToCFHost中的内存泄漏
我正在转换可用的SKP_SMTP库,以便在我的iPhone应用程序中实现SMTP客户端。经过一段漫长而麻烦的bug修复和内存检查工作,我已经将问题缩小到只有一个。调用CFStreamCreatePairWithSocketToCFHost(由Instruments中的泄漏工具证明)时发生内存泄漏,这对我来说似乎很奇怪,因为CFReadStreamRef参数readStream和writeStream在稍后阶段被释放,或者通过\uuuu桥接\u传输分配给相应的NSStream对象(这将最终将流内存管理从CoreFoundation带到ARC)。 我在谷歌上搜索过,但我找到的唯一解决方案是垃圾收集(显然在ARC中不可用):我是否遗漏了什么或不应该发生什么? 代码如下:, 非常感谢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对象(这将最终将流内存
@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