Jor*_*dan 3 multithreading objective-c nsautoreleasepool ios
所以,我使用[NSThread detachNewThreadSelector]来生成一个新线程,我在控制台中得到"自动释放,没有池到位"错误.我知道如果你没有创建一个自动发布池,就会发生这种情况,但问题是,我正在创建一个.我在同一个应用程序的其他部分使用类似的代码,并没有得到这些错误.
这是相关代码:
- (void) startThread:(NSString*)strURL
{
// start new thread to load image
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[NSThread detachNewThreadSelector:@selector(loadImageFromURL:) toTarget:self withObject:strURL];
[pool release];
}
- (void) loadImageFromURL:(NSString*)strURL
{
NSNumber* nn = [NSNumber numberWithInt:self.tag];
NSLog(@"loadURL: Tag number == %i", [nn intValue]);
// other code here actually does the work
}
Run Code Online (Sandbox Code Playgroud)
现在,loadImageFromURL中有更多代码实际完成了工作(从远程服务器加载图像) - 但是问题在没有代码的情况下显示出来,所以我删除了它(只是因为你不认为我有一个毫无意义的毫无意义的线程!).我只留下了一行代码来演示这个问题 - 它创建了一个自动释放的NSNumber对象.
当此代码运行时,它会向控制台报告:
__NSAutoreleaseNoPool(): Object 0x535c0e0 of class NSCFNumber autoreleased with no pool in place - just leaking
当然,真实代码会创建许多其他AR对象,并且所有这些对象都会被报告.
将不胜感激任何可能有用的提示或指示!
谢谢!
创建新线程时,还需要为其创建新的自动释放池.在您的情况下,这看起来像添加:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Run Code Online (Sandbox Code Playgroud)
在年初loadImageFromURL:和
[pool drain];
Run Code Online (Sandbox Code Playgroud)
在末尾.
您可能不需要或不想要创建的池startThread:.查看" 线程编程指南",特别是"编写线程入口例程"部分.