2

我在 iphone 上运行一些小代码时遇到了麻烦。

基本上,我只需按下一个按钮,它就会调用,它在后台线程上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],代码就可以正常工作。

所以,我认为问题出在线程+自动释放池周围,我做错了什么?我该如何解决?

PS我NSZombie启用了标志。

4

3 回答 3

0

NSLog 可能必须向 UI 线程(在主线程上执行选择器)发送一条消息以序列化打印到控制台,此时,您的 xml 已经发布。

于 2010-09-08T17:33:53.377 回答
0

在这种情况下,这无关紧要,但是您应该始终drain合并而不是release合并。

如果这就是所有代码,那真是一个奇怪的错误。

我建议的第一件事是在启用僵尸检测的情况下运行代码,同时在 Instruments 中记录所有保留/释放事件。这将为您提供有关违规对象的保留/释放清单。如果仍然没有意义,请发布结果。

于 2010-09-08T18:00:55.447 回答
0

您是否尝试过-autorelease该对象xml?这会将其添加到活动池中,apool. 声明drain比声明好-release——它们在非垃圾收集环境中是一样的,但有一天苹果可能会在 iPhone 上实现垃圾收集。希望这可以帮助。

于 2010-12-15T09:57:40.490 回答