English 中文(简体)
NSThread在第二次调用时崩溃(iPhone)
原标题:
  • 时间:2009-02-03 16:18:52
  •  标签:

我有一个对象,在该对象中启动我的线程(用于加载和执行一些URL加载)。

当我收到数据的返回时,我调用选择器在主线程上执行。

如果我第一次调用它,它可以正常工作,但第二次会崩溃(没有具体的错误)。

[NSThread detachNewThreadSelector:@selector(doThread:)
                         toTarget:self
                       withObject:@"lala"];

-(void) doThread:(NSString *)poststring {
 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];


DataModelLocator *mydelegate = [DataModelLocator instance];
NSData *postData = [poststring dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:NO];
NSURL *url = [NSURL URLWithString:[mydelegate fwaservicepath]];

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];

[request setURL:url];
[request setHTTPMethod:@"POST"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"];
[request setHTTPBody:postData];

NSURLResponse *urlResponse;

NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:nil];

if(data) {
    [self performSelectorOnMainThread:@selector(loadDidFinishWithData:)
                           withObject:data 
                        waitUntilDone:YES];
    //[self loadDidFinishWithData:data];
} else {
    [self performSelectorOnMainThread:@selector(loadDidFinishWithError:)
                           withObject:data 
                        waitUntilDone:YES];
}
[pool release];

}
}

当我调用performSelectorOnMaintThread时,它崩溃了...难道当它被释放时,它会在一个单例上崩溃吗?

最佳回答

处理线程时,要像避免瘟疫一样避免自动释放对象。自动释放池的排放时间是不确定的,会导致有趣的崩溃。在涉及的所有对象上使用alloc / init和release,并确保在从另一个线程调用performSelectorOnMainThread或detachNewThreadSelector的方法中保留所有对象。

Mac上的垃圾收集有效地解决了这些问题,但iPhone在不久的将来不会有这个功能。

问题回答

你可能想要发布更多关于你问题的信息(哪条线路崩溃,你从调试中已经找出了什么等等),这样我们才能为你提供更好的建议。如果不知道哪一行给你带来麻烦,我会猜测:听起来,可能存在某个对象正在被自动垃圾回收清除。

变量"data"来自哪里?如果你在头文件中创建它作为一个私有成员变量,你可能会有这样的情况:

NSSomeType *data = [NSSomeType builtInInitFunction];

像这样初始化的变量通常会自动释放,但您可能希望确保垃圾回收保留该对象的实例。尝试类似以下方式:

// Objects initialized with init are retained
NSSomeType *data = [[NSSomeType alloc] init];

// Objects that would normally be autoreleased can be marked as retain
NSSomeType *data = [[NSSomeType builtInInitFunction] retain];

我不确定你的代码是如何构建的,但是一定要为每个保留和初始化添加至少一个释放!我还是Objective-C的新手,所以有点像瞎子领着瞎子,把我的建议当做一种参考。

请查看Learn Objective-C中的“更多关于内存管理”的部分以获取更多信息。

编辑2:澄清示例代码。 感谢Evan(评论)的帮助。

编辑3: 我同意Brad的意见。请考虑移除自动释放池并自己处理内存的分配、初始化和释放。我对NSURLConnection对象不太了解,但是你的*data memory是否标记为自动释放?如果是的话,你可能需要以不同的方式初始化或使用retain。

在调试器中逐步执行您的代码。找出A)确切崩溃的行以及B)所有变量的值。如果您很幸运,您会注意到其中一个值为nil。





相关问题
热门标签