performSelectorInBackground导致EXC_BAD_ACCESS

时间:2011-07-26 03:31:14

标签: iphone objective-c ios

好的,我有一个看似非常简单的情况,但无法理解。

在我的viewDidLoad中,我有:

-(void)viewDidLoad
{
    [super viewDidLoad];

    WestiesModel *model = [WestiesModel new];
    [model FetchServerData];
} // I know, I'll move the model creation out of the view controller later

我的WestiesModel.h是

 @interface WestiesModel : NSObject
 {
   NSURL *ServerURL;
   NSMutableArray *Westies; 
 }
 @property (retain) NSURL *ServerURL;
 -(void) FetchServerData;
 @end

在WestiesModel.m,我有

-(void)FetchServerData
{
    [self performSelectorInBackground:@selector(backgroundFetchServerData) withObject:nil];
}

-(void)backgroundFetchServerData
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSLog(@"%@ %d",Westies,[self retainCount]);
    [Westies addObject:@"test"];

    NSLog(@"%@ %d",Westies,[self retainCount]);
    [Westies addObject:@"test"];

    NSLog(@"%@ %d",Westies,[self retainCount]);
    [Westies addObject:@"test"];

    NSLog(@"%@ %d",Westies,[self retainCount]);
    [Westies addObject:@"test"];

    .
    .
    .

    [pool release];
}

我在backgroundFetchServerData函数中的随机点获得EXC_BAD_ACCESS。它就像模型对象一样,但我只是在viewDidLoad函数中泄漏它。我没有过滤掉这个屏幕或任何东西。我在iOS5测试版上,在模拟器上运行。

这里有什么想法吗?

1 个答案:

答案 0 :(得分:1)

  

我在随机点获得了EXC_BAD_ACCESS   backgroundFetchServerData函数。就像模型对象一样   离开,但我只是在我的viewDidLoad函数中泄漏它。我不   从这个屏幕或任何东西过渡。我正在运行iOS5测试版   在模拟器上。

iOS5测试版属于NDA;不能在这里讨论具体细节。但是,没有必要。

如果在同时执行某些操作时随机崩溃,那是因为您几乎不会正确地执行并发操作。

在这种情况下,您可能没有保留线程中使用的所有对象(在生成线程之前)并且主线程的自动释放池已经耗尽,导致看似随机的时间点崩溃

没有看到更多代码,不可能说。但是,还有几点:

  • 请勿调用 retainCount ,因为它没用。

  • 方法应以小写字母开头

  • 如果“model”是指“核心数据模型”,那么您需要阅读Core Data并发指南,因为随机分离线程将无法正常工作。看起来你没有使用CD,所以不用担心那部分。

  • 实例变量应以小写字母

  • 开头

这看起来像是线程问题或内存管理问题(或两者)。