在NSMutableArray上执行操作时的EXC_BAD_ACCESS

时间:2012-01-12 15:33:46

标签: objective-c arrays dataset nsmutablearray exc-bad-access

我目前正在尝试连接到Web服务器,并从中使用表。我已将表放入NSMutable数组(它是全局的),将其命名为DataSet(我使这部分工作)。但是,当我尝试在其上执行任何类型的操作时(例如:count),它将给我一个EXC_BAD_ACCESS。顺便说一句,我使用带有ARC的xcode 4.2,因此它不是内存管理问题。有什么建议吗?

- (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

    }
}

我不确定我是否想要,但我读到我应该使用Diagnostics,所以我打开了NSZombie对象,Malloc后卫和Malloc Stack。 他们说我应该在gdb控制台中键入它 info malloc-history( memorylocation

但是,我不知道从哪里获取问题的内存位置。我将不胜感激任何帮助。

我无法让这个工作,所以我尝试使用NSDictionary而不是NSArray,令人惊讶的是它有效!这是我更新的代码,适用于任何想知道我做了什么的人。

  • (无效)viewDidLoad中

{

NSURL *url = [NSURL URLWithString: @"url.com"];
NSData *jsonData =[NSData dataWithContentsOfURL:url];
DataSet = [[NSDictionary alloc] init];

如果(jsonData)     {

    xmlParser = [[NSXMLParser alloc] initWithData: jsonData];
    [xmlParser setDelegate: self];
    [xmlParser setShouldResolveExternalEntities:YES];
    [xmlParser parse];
}
NSLog(@"%@",DataSet.allKeys);

/////默认的东西///     } }

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName

{

if ([elementName isEqualToString:@"string"])
{


    //NSLog(@"%@",DataSet);
    DataSet = [soapResults JSONValue];
    NSLog(@"%@",DataSet);

}

}

1 个答案:

答案 0 :(得分:0)

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中将存储所有已解析的对象