objective-c - 保留在 NSThread 中创建的对象

标签 objective-c cocoa multithreading memory-management thread-safety

我有以下方法,它是通过调用新线程(使用 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/

相关文章:

objective-c - 为什么基于自动布局的 NSWindow 在缩放后重绘不正确?

iphone - Cocoa XML-RPC 框架 XMLRPCConnection 方法

iOS UI 旋转器在处理后台线程时卡住

c - libcurl 库是否提供了任何方法来确定哪个响应头来自哪个命令?

objective-c - 在c中查找文件路径

ios - UIWebview将不会在后台播放

objective-c - 快速枚举循环中未声明的标识符错误

xcode - 使用 OpenGL 在 mac osx cocoa 应用程序中设置连续渲染

java - 如何知道 ScheduledExecutorService 何时完成

ios - NSURLRequestReloadIgnoringLocalAndRemoteCacheData 在 iOS 7 中工作吗?