我在iPhone上运行一些小代码的时间很糟糕。iphone:线程+发布池+ [object release] =“发送到释放实例的消息”
基本上,我只是按下一个按钮,它调用runTest
,它在后台线程上运行test
方法。这就是为什么我创建了一个自动释放池。
如果我运行下面的代码我得到了控制台上一个美丽的消息说:
2010-09-07 11:45:15.527 test[1312:207] *** -[CFString release]: message sent to deallocated instance 0x3d52ba0
-(void) test {
NSAutoreleasePool *apool = [[NSAutoreleasePool alloc] init];
NSString *xml = [[NSString alloc] initWithFormat:@"<%@>", @"msg"];
NSLog(@"%@\n",xml);
[xml release];
[apool release]; // <-- this line throws the error msg
}
- (IBAction) runTest: (id)sender
{
[self performSelectorInBackground:@selector(test) withObject:nil];
}
我发现:如果我不运行在后台线程test
(无自动释放池) ,只需拨打[self test]
,代码工作正常。
所以,我认为问题是围绕线程+ autorelease池,我做错了什么?我该如何解决它?
P.S.我已启用NSZombie
标志。
我用上面给出的确切代码创建了一个简单的测试用例应用程序,它可以正常工作,并且没有错误。更可能有一些你省略的代码是罪魁祸首。 – 2010-09-08 18:18:16
快速问题:为什么你需要这里的autorelease池? – jrtc27 2010-09-08 18:45:47
使用Cocoa或iOS Objective-C API时,您总是需要一个自动释放池。在自己进行线程化时,您必须手动管理池。 – bbum 2010-09-08 19:52:14