我有一个叫10次的线程:
[NSThread detachNewThreadSelector:@selector(workInBackground:) toTarget:self withObject:sendArray];
这是“workInBackground”方法:
- (void)workInBackground:(NSArray*)dataArray{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // create release pool
// display dataArray sent from Main Thread
NSLog(@"%i, %@", [[dataArray objectAtIndex:0] intValue], [dataArray objectAtIndex:1]);
// Fetch data from URL
NSString *myURL = [NSString stringWithFormat:@"http://somesite.com/index.php?s=%@", [dataArray objectAtIndex:1]];
NSURL *url = [[NSURL alloc] initWithString:myURL];
NSString *strResult = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
// display dataArray sent from Main Thread ... AGAIN
NSLog(@"this will show");
NSLog(@"%i, %@", [[dataArray objectAtIndex:0] intValue], [dataArray objectAtIndex:1]);
NSLog(@"this will not show");
// Code that returns super cool data to the main thread
[pool release]; // empty pool
我不是100%确定数据是否已损坏,但我不明白为什么同一行代码(NSLog)会使应用程序崩溃。我必须在从URL获取后使用我的dataArray中的数据,但不能。
我是Objective C的新手,所以如果我的错误很明显,我很抱歉:)
- UPDATE - 发送到此方法的对象未被保留,这就是问题所在!
答案 0 :(得分:1)
如何创建和管理发送到后台线程的数组?
如果发生了崩溃,请发布回溯。
您的解决方法不是解决方法,只是缩小了杀死您应用的竞争条件的窗口。
最好的猜测(缺少显示数组如何创建的代码)是在后台线程完成数组和字符串之前,主线程正在释放你的数组。
为每个生成的线程保留一次数组,然后在完成后将其释放到线程中。
更好的是,使用GCD +块。