当我在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请求。但有时候(8次中的一次)内存泄漏将发生在我注意到的那一行。在ios模拟器上进行测试时,这种情况从未发生过。我想知道可能的原因以及如何解决它?
答案 0 :(得分:0)
原因可能是最有可能是无效的内存管理。您可以在XCode中分析项目,转到项目选项卡并选择分析内存泄漏实际发生的位置,或者从同一路径运行Profile以检测任何特定的内存泄漏。看看这个link,关于如何调试与内存相关的问题是一个非常酷的话题。
答案 1 :(得分:0)
在将ftpStream类型转换为NSInputStream后,您将释放它(CFRelease(ftpStream))并再次使用它if (self.networkStream == nil)
。不要在ftpStream上调用CFRelease()并在完成后释放NSInputStream。