我正在接近Xcode编程的学校项目的结束,但是现在我有一个小但非常烦人的问题:内存泄漏。泄漏已经追溯到以下代码行:
@autoreleasepool {
[NSThread detachNewThreadSelector:@selector(updateThread) toTarget:self withObject:nil];
}
当我发表评论时,泄漏消失了。显然autoreleasepool出了问题:我对这些问题仍然有点新意见(特别是在使用ARC时),但像this one这样的线程让我清楚地知道使用@autoreleasepool就足够了。
出于某种原因,我的代码不是这种情况。我想我在这里遗漏了一些东西:如果有人可以就问题可能给出一些想法,那么我将非常感激。只要告诉我是否必须发布更多代码,这不会是一个问题:这只是为了问题的可读性,我试图将其限制为主要问题。
提前致谢!
编辑:
感谢您的第一反应!然而问题仍然存在......我将发布更多代码来清理一些事情。该线程在viewDidLoad:
中启动/*
Everything mentioned here will be done after loading.
*/
- (void)viewDidLoad
{
// Do standard setup
[super viewDidLoad];
// Do any additional setup before loading the view from its nib.
self.title = @"Blog Manager";
// Activate edit mode
[tbvBlogList setEditing:YES animated:YES];
tbvBlogList.allowsSelectionDuringEditing = YES;
[NSThread detachNewThreadSelector:@selector(updateThread) toTarget:self withObject:nil];
UIImage *btnImage = [UIImage imageNamed:@"iPhone_General_Button_Add_Blog.png"];
UIButton *viewBtnAddBlog = [UIButton buttonWithType:UIButtonTypeCustom];
[viewBtnAddBlog setImage:btnImage forState:UIControlStateNormal];
viewBtnAddBlog.frame = CGRectMake(0, 0, 80, 36);
[viewBtnAddBlog addTarget:self action:@selector(addBlogByButton:) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *btnAddBlog = [[UIBarButtonItem alloc] initWithCustomView:viewBtnAddBlog];
btnAddBlog.tintColor = [UIColor clearColor];
self.navigationItem.rightBarButtonItem = btnAddBlog;
}
然后,用于线程的其他函数:
/*
Thread to update the progress bar with.
*/
- (void)updateThread
{
@autoreleasepool {
while(YES){
[self performSelectorOnMainThread:@selector(updateProgressBar) withObject:nil waitUntilDone:false];
[NSThread sleepForTimeInterval:0.1f];
}
}
}
/*
Updates the progress bar.
*/
- (void)updateProgressBar
{
pvProgress.progress = dProgress;
}
如果有什么值得一提:我正在使用Xcode 4.2.1。再次感谢您的支持!
答案 0 :(得分:2)
现在我只想用摇滚乐打自己。
我刚刚意识到“while”-loop永远不会停止。当然这意味着线程将继续运行,因此在应用程序完成之前,内存将不会被释放。
通过简单地添加一个在线程退出时设置为“NO”的布尔值,问题就解决了。大家:非常感谢你为我看这个问题。有时最大的问题是最小的解决方案......
答案 1 :(得分:1)
@autoreleasepool
块在您的线程代码中(在这种情况下为updateThread
),而不是创建线程。
答案 2 :(得分:1)
您没有在分离选择器的方法中创建自动释放池。每个线程选择器都需要自己的池。这样做:
- (void) updateThread
{
@autoreleasepool {
// former code here
}
}