使用NSAutoReleasePool进行EXC_BAD_ACCESS

时间:2010-03-31 16:44:42

标签: iphone objective-c cocoa-touch multithreading

我正在分离新帖子

[NSThread detachNewThreadSelector:@selector(loadAvatar) toTarget:self withObject:nil];

我在

上获得了EXC_BAD_ACCESS
STObject* st = [cellitem get:@"stobject"];

在我的以下方法中

-(void)loadAvatar
{   

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    STObject* st = [cellitem get:@"stobject"];
    //do stuff...
    [pool release];
}

我试过保留st但没有运气。当我运行此代码而不分离新线程时,我没有任何问题。我不确定我错过了什么。

UPDATE cellitem是NSObject的子类,包含一些属性,如字典和字符串。

get方法基本上从字典中返回一个字符串

2 个答案:

答案 0 :(得分:3)

保留st对你没有多大好处,因为EXC_BAD_ACCESS错误源于作业发生之前。问题在于访问cellItem或在get方法中。无论哪种方式,您都可能尝试访问已发布的对象。尝试使用zombie detection enabled运行工具。

答案 1 :(得分:1)

不完全确定为什么这个解决方案有效,但我告诉我的线程睡眠0.1秒,似乎解决了所有问题。

    [NSThread detachNewThreadSelector:@selector(loadAvatar) toTarget:self withObject:nil];
    [NSThread sleepForTimeInterval:0.1];

有谁知道为什么会这样?我猜测睡眠会阻止某些物体过早释放?可能是一个hacky修复。