我有以下方法,它是通过调用新线程(使用 NSThread)产生的:
- (void) updateFMLs {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSArray *temp = [[NSArray alloc] initWithArray:someArrayFromAnotherProcess];
[self performSelectorOnMainThread:@selector(doneLoading:) withObject:temp waitUntilDone:NO];
[pool release];
}
我的 doneLoading:
方法如下所示:
- (void) doneLoading:(NSArray *)obj {
myArray = [[NSArray alloc] initWithArray:obj copyItems:NO];
}
myArray
的内容变得无效。如何保留 myArray
的内容,以便稍后在我的应用程序中使用它们?
附注myArray
在类头文件中定义。
最佳答案
如果您的后台线程做了一些工作并且需要将 NSArray
“传递”到您的主线程,那么所有 didLoading 需要做的是:
-(void)doneLoading:(NSArray *)obj
{
[myArray release]; // release the previous array and its objects
myArray = [obj retain];
// now use myArray, refresh tables, etc.
}
(可能)不需要创建数组的另一个副本,这可能是根本问题。您还应该在 performSelector
调用之后调用 [temp release]
,因为其参数已被保留。
如果myArray
的内容以某种方式变得有效,那么它们就会在某个地方双重释放。 myArray
将保留添加到其中的任何对象。您提到 myArray
本身正在变得无效,因此请尝试使用此模式重写您的后台线程和 didLoading 方法。
最后,您应该使用[pool排出]
代替[poolrelease]
。
关于objective-c - 保留在 NSThread 中创建的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1225505/