第二次调用时使用 JSONKit 的内存泄漏

Posted

技术标签:

【中文标题】第二次调用时使用 JSONKit 的内存泄漏【英文标题】:memory leak using JSONKit when called a second time 【发布时间】:2011-07-01 14:06:18 【问题描述】:

我已经阅读了有关内存管理的 Apples 文档,并且觉得我理解它们,但我不能让它不泄漏。在这个例子中,我让进程在主线程上运行以保持简单。第一次点击搜索按钮一切正常,没有泄漏。第二次点击/执行搜索,一切正常,但仪器显示以下泄漏:

Leaked Object   #   Address Size    Responsible Library Responsible Frame
NSCFString,42   < multiple >    1.30 KB CTContacts  jk_cachedObjects
NSCFString,16   < multiple >    464 Bytes   CTContacts  jk_cachedObjects
JKDictionary,7  < multiple >    224 Bytes   CTContacts  jk_object_for_token
Malloc 288 Bytes,7  < multiple >    1.97 KB CTContacts  jk_object_for_token
Malloc 32 Bytes,    0x7859a30   32 Bytes    CTContacts  jk_object_for_token
JKArray,    0x78599f0   32 Bytes    CTContacts  jk_object_for_token

它似乎指向这一行:(列为 %100)

NSDictionary *resultsDictionary = [jsonData objectFromJSONDataWithParseOptions:JKParseOptionStrict error:(NSError **)error];

我试过 NSDictionary *resultsDictionary =[ [[NSDictionary alloc]init]autorelease];但结果相同。

以下是涉及的两种方法:

- (void) searchBarSearchButtonClicked:(UISearchBar *)theSearchBar     
pickerView.hidden=YES;
searchBar.showsScopeBar=YES;
[searchBar setShowsCancelButton:NO animated:YES];
[searchBar resignFirstResponder];

[self queryWebService];


-(void) queryWebService

NSString *urlAddress = [NSString stringWithFormat:@"http://myweb.com/json.php?lname=%@&searchType=%@",searchBar.text,currentSearchCategory];

NSURL *url = [NSURL URLWithString:urlAddress];

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDelegate:self];
[request startSynchronous];
NSError *error = [request error];
if (!error)
    NSString *responseString = [request responseString];
    //NSLog(@"Response: %@", responseString);

    NSData *jsonData = [responseString dataUsingEncoding:NSUTF8StringEncoding];
    NSError *error = nil;

    NSDictionary *resultsDictionary = [jsonData objectFromJSONDataWithParseOptions:JKParseOptionStrict error:(NSError **)error];

    if (resultsDictionary)
    
        rows = [[resultsDictionary objectForKey:@"contacts"] retain];
        resultsDictionary=nil;
    
        
[myTableView reloadData];

NSArray "rows" 用作 tableView 数据源。任何帮助将不胜感激,谢谢。

【问题讨论】:

【参考方案1】:

我想rows 是原因。每次运行循环时,都会向其中添加另一个 retain。摆脱retain 应该可以解决问题并摆脱内存泄漏。如果由于某种原因,retain 是必要的,你只需要在其他地方找到一个地方来释放它并将你的保留计数保持在适当的值

【讨论】:

Duhhh,我是否说过我掌握了这些记忆的东西。谢谢slev,就是这样。不知道如何接受这个作为正确答案,我稍后再回来看看选项是否可用。 哈哈,随着时间的推移,你会掌握它的窍门。所以那里不用担心。但我们非常欢迎您 您是否尝试在其上运行静态分析工具?它可能会抓住它。 我建议保留 rows 变量,因为它可以被自动释放(在示例中很难知道返回的方法是否自动释放)并导致崩溃。但是,在您保留它之前,您需要释放以前的数据。 IE。 [行释放];行 = ..... 保留];

以上是关于第二次调用时使用 JSONKit 的内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

JSONKit 是不是会造成内存泄漏?

OpenGL VBO 会泄漏内存吗?

内存泄漏和内存溢出的区别

Android开发常见的Activity中内存泄漏及解决办法

PowerPoint 2010 内存泄漏?

为啥苹果提供的 SimpleFTPSample 会泄漏内存?