2011-12-06 2 views
1

Xcode 4.2から "analyze"メニューオプションを使用していますが、3つの "潜在的なリーク"があります。 「潜在的なリーク」とは何ですか?Xcodeで「潜在的なリーク」とは何ですか?無視することはできますか?

私がアプリケーションをビルドして実行すると、すべて正常に動作します。 「漏れ」ツールを使用すると、コードのこれら3つの部分のどれも漏れているように見えません。だから、これらの「潜在的なリーク」は無視されますか?

「潜在的なリークが」(ノート、これらはコードの連続ブロックではなく、別のファイルにある)されている含まれているコードの3つのセクションが...

まず...

- (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

"潜在的なリーク"は、静的解析が標準のメモリ管理ルールの違反を特定した場所です。しかし、これがリークであることは100%肯定的なものではありません(ルールに違反する慣習的でないコードを書いても、保持/解放のバランスを保ちますが、それはかなりまれです)物の –

答えて

2

アナライザーの矢印インジケーターをクリックすると、漏れの可能性があるコードのパスが表示されます。

パート1:自動解放responseData用 :

responseData = [NSMutableData data]; 

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

NSURLConnection

が割り当てられる第2部: @Bill Branskyによって回答を見る

パート3:

[stories addObject:[アイテムコピー]];

copyは参照カウントを増加させ、addObjectも参照カウントを増加させます。 storiesオブジェクトがリリースである場合、各アイテムにリリースが送信されますが、copyからの余分な参照カウントが残ります。

copyについては、コードを書くときに、常に各文と文の部分が書かれている理由を正確に知る必要があります。もし疑問があれば研究する。正確に知らなくてもコードを追加すると、「偶然によって動く」という脆弱性が生じ、後に問題が発生する可能性があります。

Appleのメモリ管理ドキュメントを勉強するのに本当に役立ちます。また、ARCを強く検討してください。

あなたの質問に答えて、リークはクラッシュを引き起こすことはありませんが、メモリを使用すると問題になる可能性があります。

0

パート1で何かコピー/貼り付けが間違っていると思います。NSURLConnection alloc/initがあります。あなたが何をinit'ingしているかは言わない。しかし、それが何であれ、それは完了したら解放されるべきです。

第2部では、セルをオートリリースするように設定する必要があります。そこにあなたの潜在的なリークを修正します。

第3部では、[アイテムのコピー]を保持するアイテムを追加しています。これによりアイテムが漏れます。それをどのように設定したのか再考する必要があるかもしれません。

0

ライン:最後の行として

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

をメソッド本体の最後は私にリークのように見えるの前に - あなたは慣例によって保持オブジェクトを返す「のinit」メソッドとオブジェクトを割り当てますオブジェクトへの参照をivarで保持せずに。

0

これらの潜在的なリークをクリアする必要があります。オブジェクトの割り当てと割り当て解除に焦点を当てます。

関連する問題