Iphone sdk中自动释放池中的内存泄漏

时间:2010-03-25 09:37:22

标签: objective-c

我在[泳池发布]发现泄漏;

我的代码是:

#pragma mark UISearchBarDelegate delegate methods


- (void)performSearch:(UISearchBar *)aSearchBar
{

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

artistName= [aSearchBar.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
if ([artistName length] > 0) 
{

    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

    LyricsAppDelegate* appDelegate =  (LyricsAppDelegate*) [ [UIApplication sharedApplication] delegate];
    artistsList=[appDelegate doSearch:artistName ];
    [theTableView reloadData];
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;


    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;


    [aSearchBar resignFirstResponder];
}
else
{
    [aSearchBar resignFirstResponder];
}
[NSThread exit];
[pool release]; 

}

- (void)searchBarSearchButtonClicked:(UISearchBar *)aSearchBar
{
@try {
    [NSThread detachNewThreadSelector:@selector(performSearch:) toTarget:self withObject:aSearchBar];
    [aSearchBar resignFirstResponder];
}
@catch (NSException * e) {
    NSLog(@"\n caught an exception");
}
@finally {
}
}

我在[泳池发布]发现泄漏;在performSearch方法中。

我该如何解决这个问题。

任何人的帮助将不胜感激。

谢谢你, Monish。

2 个答案:

答案 0 :(得分:1)

在退出当前线程之前尝试释放池吗?

...
[pool release]; 
[NSThread exit];

编辑:来自NSThread -exit参考:

  

应避免调用此方法   因为它没有给你的线程   有机会清理它的任何资源   在执行期间分配。

你真的需要把这个功能称为BTW吗?

答案 1 :(得分:0)

除了弗拉基米尔的回答指出自动释放池泄漏,artName和& artistList在将它们设置为新值(否则旧对象被泄露)之前缺少release消息,之后发送retain消息(因此当自动释放池耗尽时新对象会消失)

[artistsList release];
artistsList = [[appDelegate doSearch:artistName] retain];