我正在使用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]];
}
}
任何人都可以看到这些代码段的任何明显问题,还是我可以忽略这些“潜在的”漏洞?
答案 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)
你应该清除那些潜在的泄漏。专注于对象的分配和释放。