在iOS后台线程中使用自动释放变量

在iOS后台线程中使用自动释放变量,ios,objective-c,multithreading,pool,autorelease,Ios,Objective C,Multithreading,Pool,Autorelease,在iOS应用程序中,我启动了几个后台线程来处理从REST服务返回的XML 我有几个用户在PeopleParser.m中的[self.names addObject:name]代码行遇到间歇性崩溃。崩溃日志没有指明原因,只是指明了崩溃的代码行。我无法重现崩溃,所以我假设它与记忆有关。在for循环完成之前,是否有可能正在释放我的*xml对象(可能由主线程池释放)?注意,我没有在后台线程中声明自动释放池 费彻 PeopleParser.h PeopleParser.m 事故日志 异常类型:EXC_崩溃

在iOS应用程序中,我启动了几个后台线程来处理从REST服务返回的XML

我有几个用户在PeopleParser.m中的[self.names addObject:name]代码行遇到间歇性崩溃。崩溃日志没有指明原因,只是指明了崩溃的代码行。我无法重现崩溃,所以我假设它与记忆有关。在for循环完成之前,是否有可能正在释放我的*xml对象(可能由主线程池释放)?注意,我没有在后台线程中声明自动释放池

费彻 PeopleParser.h PeopleParser.m 事故日志 异常类型:EXC_崩溃(SIGABRT) 异常代码:0x0000000000,0x0000000000000000 崩溃线程:7

上次异常回溯:

0 CoreFoundation 0x3465229e例外预处理+158

1 libobjc.A.dylib 0x3c37a97a objc_异常_抛出+26

2 CoreFoundation 0x3459c8d4-[\uu nsarray插入对象:atIndex:+764

3 MyApp 0x000fee36-[PeopleParser parseXMLData:parseError:](PeopleParser.m:62)

4 MyApp 0x000e9b4c\uuuu50-[Fetcher peopleFetchComplete:][u block\u invoke(Fetcher.m:818)

在执行块之前,可能会解除分配“self.names”。 确保取消阻止操作或保护此类不被释放(通过使用加载屏幕阻止屏幕),以便用户无法返回

例如,它可能发生在unloadView或类似的地方(如果粘贴更多代码,可能会更准确)


基于此,我认为异常是从insertObject方法调用的——这意味着您很可能正在尝试插入一个“nil”对象。在将其添加到数组之前,请尝试添加if(name){}——在这种情况下,XML文件可能有问题。

不,不是<代码>self被块在其创建点捕获-在
-(void)doFoo
中,导致额外的
保留在其上。但是,可能不是线程安全的是访问
self.names
请参见编辑。我在问题中添加了大量代码,以及崩溃报告。很抱歉,我之前没有添加此项,我试图限制范围并保持简单。基于此,我认为从insertObject方法调用异常-这意味着您很可能正在尝试插入一个“nil”对象。在将其添加到数组之前,尝试添加if(name){}——在这种情况下,XML文件可能有问题;收到了一份非常相似的坠机日志。我必须定期从REST服务中获取错误的XML。请编辑以上答案以匹配您的指令,我将单击复选标记。谢谢拜托,这不是真正的代码。调用
dispatch\u async
时没有右括号
-initWithContext:
声明为返回
id
,但没有返回语句。如果你有一个异常,而不是崩溃,请打印出异常所说的内容。很抱歉输入错误-我正在删除与我试图指出的问题无关的内容,主要是NSLog语句和无关对象,以使代码更易于阅读(我想没有人希望我发布一个800行的类)。我做了一些修改来纠正这些问题。此外,我没有异常,因为这是一个我无法在调试器中重现的错误。崩溃日志就是这样——我希望苹果能把它写得更详细,但事实并非如此。
-(void) peopleFetchComplete:(ASIHTTPRequest *)theRequest {

    dispatch_async( backgroundQueue, ^{
       PeopleParser *xmlParse = [[PeopleParser alloc] initWithContext:[self managedObjectContext]];
       [xmlParse parseXMLData:[theRequest responseData] parseError:&parseError];
       [xmlParse release];
    });
}
@interface PeopleParser : NSObject {
    NSMutableArray *names;
    ...
}

-(void)parseXMLData:(NSData *)data parseError:(NSError **)error;

@property (retain, nonatomic) NSMutableArray *names;
-(id)initWithContext:(NSManagedObjectContext *)managedObjContext{
    self = [super init];
    self.managedObjectContext = managedObjContext;
    names = [[NSMutableArray alloc] init];
    return self;
}

-(void)dealloc{
    [names release];
    [managedObjectContext release];
}

@synthesize names;

-(void)parseXMLData {

    //documentWithData returns an autorelease object
    SMXMLDocument *xml = [SMXMLDocument documentWithData:someNSData error:nil];
    NSArray *people = [[document root] children];

    for (SMXMLElement *element in people) {
        NSString *name = [element attributeNamed:@"personName"];
        [self.names addObject: name];  //CRASHES HERE occasionally 
    }

    //do additional stuff with the data
    ...
}