【问题标题】:What are 'Potential Leaks' in Xcode, and can they be ignored?Xcode 中的“潜在泄漏”是什么,它们可以被忽略吗?
【发布时间】:2011-12-06 21:59:59
【问题描述】:

我正在使用 Xcode 4.2 中的“分析”菜单选项,我有三个“潜在泄漏”。什么是“潜在泄漏”??

当我构建并运行应用程序时,一切正常。当我使用“泄漏”工具时,这三部分代码都没有泄漏。那么这些“潜在的泄漏”可以忽略吗?

包含“潜在泄漏”的三段代码是(注意,这些不是连续的代码块,而是位于不同的文件中)...

首先...

- (void)DoDomainCheck {
AppDelegate *dataCentre = (AppDelegate *) [[UIApplication sharedApplication] delegate];
NSString *queryStringFull = [queryStringFirst stringByAppendingString:dataCentre.DomainCheckData];
labeltocheck.text = dataCentre.DomainCheckData;

responseData = [NSMutableData new];
NSURL *url = [NSURL URLWithString:@"http://www.myurl.com/whois.php"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
NSData *requestData = [queryStringFull dataUsingEncoding:NSUTF8StringEncoding];

[request setHTTPMethod:@"POST"];
[request setValue:@"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" forHTTPHeaderField:@"Accept"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setValue:[NSString stringWithFormat:@"%d", [requestData length]] forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody: requestData];
[[NSURLConnection alloc] initWithRequest:request delegate:self];
}

第二...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}

int storyIndex = [indexPath indexAtPosition: [indexPath length] - 1];
cell.textLabel.text = [[stories objectAtIndex: storyIndex] objectForKey: @"date"];
cell.detailTextLabel.text = [[stories objectAtIndex: storyIndex] objectForKey: @"title"];

[cell.textLabel setLineBreakMode:UILineBreakModeWordWrap];
[cell.textLabel setNumberOfLines:0];
[cell.textLabel sizeToFit];

cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
return cell;
}

第三...

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if ([elementName isEqualToString:@"item"]) {
    [item setObject:currentImage forKey:@"media"];
    [item setObject:currentTitle forKey:@"title"];
    [item setObject:currentLink forKey:@"link"];
    [item setObject:currentSummary forKey:@"summary"];
    [item setObject:currentDate forKey:@"date"];
    [stories addObject:[item copy]];
}
}

任何人都可以看到这些代码部分的任何明显问题,还是我可以忽略这些“潜在”泄漏?

【问题讨论】:

  • “潜在泄漏”是静态分析器识别出违反标准内存管理规则的地方。但是,不能 100% 肯定这是一个泄漏(可能会编写违反规则的非常规代码并最终平衡保留/释放,但这非常罕见),但它通常非常擅长识别这种类型的东西。

标签: xcode memory-leaks


【解决方案1】:

在分析器中单击箭头指示器以查看产生潜在泄漏的代码的路径。

第 1 部分: 对于自动发布的 responseData 使用:

responseData = [NSMutableData data];

[[NSURLConnection alloc] initWithRequest:request delegate:self];

分配了一个NSURLConnection

第 2 部分: 查看@Bill Bransky 的答案

第 3 部分:

[故事添加对象:[项目副本]];

copy 不是必需的,它增加了引用计数,addObject 也增加了引用计数。当stories 对象被释放时,将向它的每个项目发送一个释放,但仍然会有来自copy 的额外引用计数。

关于copy,在编写代码的时候,总是清楚地知道为什么要写每个语句和语句部分。如果有疑问研究。在不确切知道的情况下添加代码会造成“巧合”,很脆弱,以后可能会导致问题。

这对你学习苹果的内存管理文档很有帮助。也强烈考虑 ARC。

在回答您的问题时,泄漏不会导致崩溃,但会使用内存,这可能是个问题。

【讨论】:

    【解决方案2】:

    我认为在第 1 部分中复制/粘贴有问题。你有你的 NSURLConnection alloc/init。没有说你在做什么。但不管它是什么,它应该在完成后释放。

    第 2 部分,需要将您的单元格设置为自动释放。将修复您那里的潜在泄漏。

    第 3 部分,您将在 [项目副本] 中添加保留项目。这将导致项目泄漏。可能需要重新考虑如何设置。

    【讨论】:

      【解决方案3】:

      那行:

      [[NSURLConnection alloc] initWithRequest:request delegate:self];
      

      因为方法体结束前的最后一行对我来说似乎是泄漏 - 您使用“init”方法分配一个对象,按照惯例,该方法返回一个保留对象,而不在 ivar 中保留对该对象的引用.

      【讨论】:

        【解决方案4】:

        你应该清除那些潜在的泄漏。关注对象的分配和释放。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-09-14
          • 1970-01-01
          • 2011-11-12
          • 2015-08-04
          • 1970-01-01
          • 2011-09-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多