[objective-c]Xcode 目标 C-帮助与使用 NSThread 的 NSAutoreleaseNoPool 错误

标签: Xcode Objective-C
发布时间: 2017/3/27 2:42:21
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

嘿,专家,我在 NSThread 有点问题。Xcode 不断给我"* __NSAutoreleaseNoPool()︰ 没有游泳池中只漏水的地方 — — 0x5694dc0 的类 NSCFString autoreleased 对象"错误。

我正确地声明了池与线 NSAutoreleasePool * 池 = [[NSAutoreleasePool 分配] init];

然后在我的循环结束我使用: [池释放];

这是因为我作为 performSelectorInBackground 使用委托方法吗? 谢谢你的计算器。

    - (void)preFetch { //process filenames to be downloaded and assign types to each one
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSArray *regions = [NSArray arrayWithObjects: @"dr_national", @"ds_ir", @"conus_FL360", @"FL360_conus", @"dr_nw", @"dr_nc", @"dr_ne", @"dr_sw", @"dr_sc", @"dr_se", @"ds_ir_nw", @"ds_ir_nc", @"ds_ir_ne", @"ds_ir_sw", @"ds_ir_sc", @"ds_ir_se", nil];
    NSError* error;
    for (NSString *regionDir in regions) {
        NSLog(@"region now: %@", regionDir); foo = 0;
        NSString *regUrl = [NSString stringWithFormat:@"http://someUrl/%@/index.lst", regionDir ];
        NSString* text1 = [NSString stringWithContentsOfURL:[NSURL URLWithString:regUrl ] encoding:NSASCIIStringEncoding error:&error];
        NSArray *listItems = [text1 componentsSeparatedByString:@"\n"];
        for (int k=0; k<[listItems count]; k++) {
            if ([[listItems objectAtIndex:k] length] != 0){
                NSString *newpath = [NSString stringWithFormat:@"http://someUrl/%@", [listItems objectAtIndex:k]];
                NSLog(@"newpath: %@",newpath);
                [self performSelectorInBackground:@selector(moveProgressBar) withObject:nil];
                [self fetchImages:newpath:type]; //pass multiple arguments to fetchImages, newpath and type
            }
        }
    }
    [pool release];
}

    - (void)moveProgressBar{
        [delegate increaseAmount];
    }

解决方法 1:

你应该只是 autorelease 池在方法中,自设立不同的线程上被调用。

- (void)moveProgressBar
{
     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
     [delegate increaseAmount];
     [pool drain];
}

编辑

话虽如此,看代码本身,看来你可能会试图更新 UI 的一个后台线程?任何这样的代码应该在主线程上执行。

如果你有长时间运行的流程,你想要运行不锁定用户界面,并可以使用户更新的进展,从典型的模式,将做处理本身在后台线程上的,并定期更新 UI 使用 performSelectorOnMainThread:

赞助商