gpt4 book ai didi

iphone - 为什么当我执行 PerformSelectorInBackground :? 时没有自动释放池

转载 作者:行者123 更新时间:2023-12-03 18:53:56 24 4
gpt4 key购买 nike

我正在调用一个在后台线程中运行的方法:

[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];
}

尽管我确实为该线程创建了一个自动释放池,但我总是收到此错误:

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: 的调用创建一个自动释放池,但这没有帮助。

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

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

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

最佳答案

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

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

我建议您在将选择器的参数作为参数传递后对其进行释放。

关于iphone - 为什么当我执行 PerformSelectorInBackground :? 时没有自动释放池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/929485/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com