EXC_BAD_ACCESS при выполнении операции над NSMutableArray
В настоящее время я пытаюсь подключиться к веб-серверу и использовать таблицу из него. Я поместил таблицу в массив NSMutable (он глобальный), назвал его DataSet (у меня эта часть работает). Однако, когда я пытаюсь выполнить любой тип операции над ним (Пример: количество), он выдаст мне EXC_BAD_ACCESS. Кстати, я использую xcode 4.2 с ARC, так что это не проблема управления памятью. Какие-либо предложения?
- (void)viewDidLoad
{
NSURL *url = [NSURL URLWithString: @"`url.com`"];
NSData *jsonData =[NSData dataWithContentsOfURL:url];
if(jsonData)
{
xmlParser = [[NSXMLParser alloc] initWithData: jsonData];
[xmlParser setDelegate: self];
[xmlParser parse];
}
NSLog(@"This is Number of elements: %@",[DataSet count]); ///<----EXC_BAD_ACCESS
..... //// default stuff//.....
}
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
if ([elementName isEqualToString:@"string"])
{
/// puts the data into Array luckyNumbers
NSError *error;
SBJsonParser *json = [[SBJsonParser new] init];
DataSet = [[NSMutableArray alloc] init];
DataSet = [json objectWithString:soapResults error:&error];
/// NSLog(@"%@",DataSet); /// this works
}
}
Я не уверен, что должен, но я прочитал, что должен использовать Диагностику, поэтому я включил объекты NSZombie, Malloc guard и Malloc Stack. Они сказали, что я должен напечатать это в консольной информации GDB malloc-history (memorylocation)
Однако я не знаю, где найти место в памяти проблемы. Буду признателен за любую помощь.
Я не мог заставить это работать, поэтому я попытался использовать и NSDictionary вместо NSArray, и удивительно это работает! Вот мой обновленный код для тех, кому было интересно, что я сделал.
- (Недействительный) viewDidLoad
{
NSURL *url = [NSURL URLWithString: @"url.com"];
NSData *jsonData =[NSData dataWithContentsOfURL:url];
DataSet = [[NSDictionary alloc] init];
if (jsonData) {
xmlParser = [[NSXMLParser alloc] initWithData: jsonData];
[xmlParser setDelegate: self];
[xmlParser setShouldResolveExternalEntities:YES];
[xmlParser parse];
}
NSLog(@"%@",DataSet.allKeys);
///// материал по умолчанию ///}}
- (void) парсер:(NSXMLParser *) парсер didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualName: (NSString *) qName
{
if ([elementName isEqualToString:@"string"])
{
//NSLog(@"%@",DataSet);
DataSet = [soapResults JSONValue];
NSLog(@"%@",DataSet);
}
}
1 ответ
1) В viewDidLoad
добавлять:
DataSet = [[NSMutableArray alloc] init];
2) В -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
if ([elementName isEqualToString:@"string"])
{
NSError *error;
SBJsonParser *json = [[SBJsonParser new] init];
[DataSet addObject:[json objectWithString:soapResults error:&error]];
[json release];
}
3) После этого в DataSet
все проанализированные объекты будут сохранены