在一个iOS应用程序中,我启动了几个后台线程来处理从REST服务返回的一些XML。
我有一些用户在PeopleParser.m中的[self.names-addObject:name]代码行遇到间歇性崩溃。崩溃日志没有显示原因,只显示了崩溃的代码行。我无法再现崩溃,所以我认为这与记忆有关。在我的for循环完成之前,我的*xml对象是否可能被释放,可能是由主线程池释放的?请注意,我并没有在后台线程中声明自动释放池。
抓取器.m
-(void) peopleFetchComplete:(ASIHTTPRequest *)theRequest {
dispatch_async( backgroundQueue, ^{
PeopleParser *xmlParse = [[PeopleParser alloc] initWithContext:[self managedObjectContext]];
[xmlParse parseXMLData:[theRequest responseData] parseError:&parseError];
[xmlParse release];
});
}
人员分析程序.h
@interface PeopleParser : NSObject {
NSMutableArray *names;
...
}
-(void)parseXMLData:(NSData *)data parseError:(NSError **)error;
@property (retain, nonatomic) NSMutableArray *names;
人员分析程序.m
-(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 {
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];
}
...
}
故障日志
异常类型:EXC_CRASH(SIGABRT)
异常代码:0x000000000000000、0x0000000000000000
断线:7
上次异常回溯:
0核心基础0x3465229e __exception预处理+158
1 libobjc.A.dylib 0x3c37a97a objc_exception_show+26
2 CoreFoundation 0x3459c8d4-[__NSArrayM插入对象:atIndex:]+764
3 MyApp 0x000fee36-[PeopleParser parseXMLData:parseError:](PeopleParser.m:62)
4 MyApp 0x000e9b4c __50-[取数人取数完成:]_block_invoke(取数器.m:818)