В приложении для iOS я запускаю несколько фоновых потоков для обработки некоторого XML-кода, который возвращается из службы REST.
У меня есть несколько пользователей, которые испытывают периодические сбои в строке кода [self.names addObject: name] в PeopleParser.m. В журналах сбоев не указана причина, только строка кода, в которой произошел сбой. Я не могу воспроизвести сбой, поэтому я предполагаю, что это связано с памятью. Возможно ли, что мой объект *xml освобождается, возможно, основным пулом потоков, до того, как мой цикл for завершится с ним? Обратите внимание, что я не объявляю пул автоматического освобождения в фоновом потоке.
Фетчер.м
-(void) peopleFetchComplete:(ASIHTTPRequest *)theRequest {
dispatch_async( backgroundQueue, ^{
PeopleParser *xmlParse = [[PeopleParser alloc] initWithContext:[self managedObjectContext]];
[xmlParse parseXMLData:[theRequest responseData] parseError:&parseError];
[xmlParse release];
});
}
PeopleParser.h
@interface PeopleParser : NSObject {
NSMutableArray *names;
...
}
-(void)parseXMLData:(NSData *)data parseError:(NSError **)error;
@property (retain, nonatomic) NSMutableArray *names;
PeopleParser.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 {
//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
...
}
Журнал сбоев
Тип исключения: EXC_CRASH (SIGABRT) Коды исключений: 0x00000000000000000, 0x0000000000000000 Разбитый поток: 7
След последнего исключения:
0 CoreFoundation 0x3465229e __exceptionPreprocess + 158
1 libobjc.A.dylib 0x3c37a97a objc_exception_throw + 26
2 CoreFoundation 0x3459c8d4 -[__NSArrayM insertObject:atIndex:] + 764
3 MyApp 0x000fee36 -[PeopleParser parseXMLData:parseError:] (PeopleParser.m:62)
4 MyApp 0x000e9b4c __50-[Fetcher peopleFetchComplete:]_block_invoke (Fetcher.m:818)
dispatch_async
нет правых скобок. Объявлено, что-initWithContext:
возвращаетid
, но оператора возврата нет. И если у вас есть исключение, а не сбой, напечатайте, что говорит исключение. - person newacct   schedule 11.09.2013