什么是Xcode中的“潜在泄漏”,它们可以被忽略吗?

时间:2011-12-06 22:00:00

标签: xcode memory-leaks

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

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

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

首先...

- (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]];
}
}

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

4 个答案:

答案 0 :(得分:2)

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

第1部分: 对于自动释放的响应数据使用:

responseData = [NSMutableData data];

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

分配NSURLConnection

第2部分: 请参阅@Bill Bransky的答案

第3部分:

[故事addObject:[item copy]];

copy不是必需的,它会增加引用次数,addObject也会增加引用次数。当stories对象发布时,将向其中的每个项目发送一个版本,但copy仍会有额外的引用计数。

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

这对学习Apple的内存管理文档非常有帮助。同时强烈考虑ARC。

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

答案 1 :(得分:0)

我认为在第1部分中复制/粘贴错误。您有NSURLConnection alloc / init。不说你是在做什么。但不管它是什么,都应该在完成后发布。

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

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

答案 2 :(得分:0)

那一行:

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

作为方法体结束前的最后一行看起来像是泄漏给我 - 你使用“init”方法分配一个对象,按照惯例,它返回一个保留的对象,而不保留对ivar中对象的引用

答案 3 :(得分:0)

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