iphone - 多线程 iPhone 应用程序因 [NSAutoreleasePool release] 崩溃

标签 iphone objective-c memory-management autorelease retain

我在多线程 iPhone 应用程序中遇到了与内存管理相关的问题。 假设我们有这个方法,它是在与主 UI 线程不同的单独线程中调用的:

- (BOOL)fetchAtIndex:(NSUInteger)index
{
    NSURL *theURL = [NSURL URLWithString:[queryURLs objectAtIndex:index]];
    // Pay attention to this line:
    NSData *theData = [[NetworkHelper fetchFromNetwork:theURL] retain];

    // Some code here...

    // Now what should I do before returning result?
    //[theData release]; ??
    //[theData autorelease]; ??
    return YES;
}

如您所见,我保留了从网络操作中返回的 NSData。问题是:为什么我不应该在方法结束时释放(或自动释放)它? 我让它工作的唯一方法是首先使用 retain ,然后什么也不用。如果我使用任何其他组合(什么都不用;retain 然后 releaseautorelease),我的程序会崩溃并显示 EXC_BAD_ACCESS 当我释放线程的 NSAutoreleasePool 时。 我错过了什么?

仅供引用,这是线程的主要代码:

- (void)threadedDataFetching;
{
    // Create an autorelease pool for this thread
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    // Reload data in separate thread
    [self fetchAtIndex:0];

    // Signal the main thread that fetching is finished
    [self performSelectorOnMainThread:@selector(finishedFetchingAll) withObject:nil waitUntilDone:NO];

    // Release all objects in the autorelease pool
    [pool release]; // This line causes EXC_BAD_ACCESS
}

感谢您的帮助!

最佳答案

您不得释放自己未保留的内容(使用 retain 或通过名称中带有 initnewcopy 的方法隐式释放)。

如果您保留 fetchFromNetwork 的结果,那么你必须释放它。两者releaseautorelease应该可以工作(不要触摸 release 之后的对象,最安全的做法是将字段/变量设置为 nil 之后的 release )。

如果您不保留数据,那么您甚至不需要保留它。 [NetworkHelper fetchFromNetwork]应该返回自动释放的对象。正文fetchFromNetwork可能看起来像这样:

NSData *data = [[NSData alloc] init];
// stuff happens
return [data autorelease];

NSData *data = [otherObject dataFromOtherObject];
// stuff happens
return data; // don't (auto)release, since you haven't retained

如果有疑问,请在泄漏方面犯错误并通过“Leaks”仪器或 LLVM checker 运行应用程序.

关于iphone - 多线程 iPhone 应用程序因 [NSAutoreleasePool release] 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1190456/

相关文章:

iphone - 在 xcode 中安装 OpenCV

ios - 如何使用 Autoresizing Masks 对 UIImageView 进行舍入?

memory-management - 如何解决 iOS 6 上 Map 的内存问题

objective-c - 静态分析器 - 内存泄漏

ios - 如何从一个文件控制所有导航栏?

iphone - 获取 UIView 的容器/UIViewController

iphone - 如何开始复杂级别的跨平台移动应用程序开发?

objective-c - 在 Swift 中使用命令行工具更新当前行

ios - 在 subview Controller 之间切换

c - socket C 的动态内存分配