ARC下的EXC_BAD_ACCESS内存错误

时间:2012-08-05 04:10:15

标签: objective-c ios

在下面的方法中,我在包含“urlString”变量的行上收到“EXC_BAD_ACCESS”。我的研究表明,当程序向已经释放的变量发送消息时会发生此错误。但是,因为我使用ARC,所以我不会手动释放内存。如何防止ARC过早释放此变量?

-(NSMutableArray *)fetchImages:(NSInteger *)count {
//prepare URL request
NSString *urlString = [NSString stringWithFormat:@"http://foo.example.com/image?quantity=%@", count];

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];

//Perform request and get JSON as a NSData object
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

//Parse the retrieved JSON to an NSArray
NSError *jsonParsingError = nil;
NSArray *imageFileData = [NSJSONSerialization JSONObjectWithData:response options:0 error:&jsonParsingError];

//Create an Array to store image names

NSMutableArray *imageFileNameArray;

//Iterate through the data
for(int i=0; i<[imageFileData count];i++)
{
    [imageFileNameArray addObject:[imageFileData objectAtIndex:i]];

}

return imageFileNameArray;

}

2 个答案:

答案 0 :(得分:6)

您的问题与ARC无关。 NSInteger不是类,因此您不希望使用%@格式。 %@将发送一个description方法给系统认为是一个对象,但是当它结果不是一个时 - CRASH。要解决您的问题,您有两种选择:

  1. 您可能需要:

    NSString *urlString = 
      [NSString stringWithFormat:@"http://foo.example.com/image?quantity=%d",
            *count];
    

    确保count指针首先有效!

  2. 您可能需要将方法签名更改为:

    -(NSMutableArray *)fetchImages:(NSInteger)count;
    

    然后更改urlString行,如下所示:

    NSString *urlString = 
      [NSString stringWithFormat:@"http://foo.example.com/image?quantity=%d", 
          count];
    

    您还需要修复所有呼叫者以匹配新签名。

  3. 第二种选择对我来说似乎更“正常”,但如果没有更多的程序,就不可能更具体。

答案 1 :(得分:2)

你也可能想要分配和初始化

NSMutableArray *imageFileNameArray;

在向其添加对象之前,否则您将继续崩溃。所以你有

//Create an Array to store image names

NSMutableArray *imageFileNameArray = [[NSMutableArray alloc] init];