0

当我在 ios 设备上测试我的应用程序时发现内存泄漏,请查看以下代码:

- (void)_startReceive
// Starts a connection to download the current URL.
{
    // Open a CFFTPStream for the URL.
    CFReadStreamRef ftpStream = CFReadStreamCreateWithFTPURL(NULL, (CFURLRef) url);

    assert(ftpStream != NULL);

    self.networkStream = (NSInputStream *) ftpStream;

    self.networkStream.delegate = self;
    [self.networkStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:RUNLOOPMODEL];

    [self.networkStream open];

    CFRelease(ftpStream);
}

- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
// An NSStream delegate callback that's called when events happen on our 
// network stream.
{
    if (self.networkStream  == nil) {    //EXC_BAD_ACCESS(code = 1,address=......)
        NSLog(@"here");
    }


    switch (eventCode) {
        case NSStreamEventOpenCompleted: {
        } break;
        case NSStreamEventHasBytesAvailable: {
            NSInteger       bytesRead;
            uint8_t         buffer[LISTDOCBUFFER];
     ......
}

我使用此代码对文档信息进行 ftp 请求。但只有有时(八次之一)内存泄漏会发生在我注意到的那一行。在 ios 模拟器上进行测试时,这从未发生过。我想知道可能的原因以及如何解决?

4

2 回答 2

0

原因可能是任何原因,但最有可能是无效的内存管理。您可以在 XCode 中分析您的项目,转到 Project 选项卡并选择分析内存泄漏实际发生的位置,或者您可以从同一路径运行 Profile 以检测任何特定的内存泄漏。查看此链接,这是一个关于如何调试内存相关问题的非常酷的主题。

于 2012-06-11T07:09:12.003 回答
0

在将 ftpStream 类型转换为 NSInputStream 之后,您将释放它 (CFRelease(ftpStream)) 并再次使用它if (self.networkStream == nil)。不要在 ftpStream 上调用 CFRelease() 并在完成后释放 NSInputStream。

于 2012-06-11T07:22:12.283 回答