2009-05-30 96 views
5

我打电话说去在后台线程的方法:当我执行SelectorInBackground时,为什么没有自动释放池?

[self performSelectorInBackground:@selector(loadViewControllerWithIndex:) withObject:[NSNumber numberWithInt:viewControllerIndex]]; 

那么,我这个是被由选择调用的方法实现:

- (void) loadViewControllerWithIndex:(NSNumber *)indexNumberObj { 
    NSAutoreleasePool *arPool = [[NSAutoreleasePool alloc] init]; 
    NSInteger vcIndex = [indexNumberObj intValue]; 

    Class c; 
    UIViewController *controller = [viewControllers objectAtIndex:vcIndex]; 

    switch (vcIndex) { 
     case 0: 
      c = [MyFirstViewController class]; 
      break; 
     case 1: 
      c = [MySecondViewController class]; 
      break; 
     default: 
      NSLog(@"unknown index for loading view controller: %d", vcIndex); // error 
      break; 
    } 

    if ((NSNull *)controller == [NSNull null]) { 
     controller = [[c alloc] initWithNib]; 
     [viewControllers replaceObjectAtIndex:vcIndex withObject:controller]; 
     [controller release]; 
    } 

    if (controller.view.superview == nil) { 
     UIView *placeholderView = [viewControllerPlaceholderViews objectAtIndex:vcIndex]; 
     [placeholderView addSubview:controller.view]; 
    } 

    [arPool release]; 
} 

Althoug我确实创造了一个自动释放池有该线程,我总是得到这个错误:如果我拿走了自动释放池

2009-05-30 12:03:09.910 Demo[1827:3f03] *** _NSAutoreleaseNoPool(): Object 0x523e50 of class NSCFNumber autoreleased with no pool in place - just leaking 
Stack: (0x95c83f0f 0x95b90442 0x28d3 0x2d42 0x95b96e0d 0x95b969b4 0x93a00155 0x93a00012) 

,我得到了一大堆这样的消息。我还尝试围绕performSelectorInBackground的调用创建一个autorelease池:但这没有帮助。

我怀疑参数,但我不知道编译器为什么会抱怨NSCFNumber。我错过了什么吗?

我的实例变量都是“非原子”的。这可能是一个问题吗?

更新:我也可能怀疑某些变量已被添加到主线程(也许是伊娃)的自动释放池中,现在它试图在错误的自动释放池中释放该变量?如果是这样,我怎么解决这个问题? (该死的,这个线程的东西很复杂;))

+0

尝试设置一个断点在_NSAutoreleaseNoPool上查看它从 – rpetrich 2009-05-31 09:11:25

+0

被调用的地方切线问题:这里在本线程中本地分配的新控制器被添加到全局数组,并且其视图也被添加为子视图。这是一个问题,因为该对象是在与其容器不同的池中创建的? – 2010-03-16 17:27:49

回答

6

最有可能的原因是因为泄漏对象(NSNumber)是从线程外部传入的参数。因此,这个变量属于调用线程(及其自动释放池)

围绕线程调用的自动释放池不起作用的原因是因为线程创建者(performSelectorInbackground) - 立即返回,很可能在线程仍在运行。

我建议你在选择器的参数作为参数传递后做一个释放。

2

我同意最有可能的原因是因为泄漏对象(NSNumber)是从线程外部传入的参数。因此,这个变量属于调用线程(和它的自动释放池)

调用线程应该使用NSAutoreleasePool ,我建议你到你的参数添加一个保留指令为:

- (void) loadViewControllerWithIndex:(NSNumber *)indexNumberObj { 
    NSAutoreleasePool *arPool = [[NSAutoreleasePool alloc] init]; 
    [indexNumberObj retain]; 

    .... 

    [arPool release]; 
    } 
相关问题