0

在下面的方法中,我在包含“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;

}
4

2 回答 2

6

您的问题与ARC无关。 NSInteger不是一个类,所以你不想使用这种%@格式。 %@将向description系统认为是对象的对象发送一个方法,但当它结果不是一个对象时 - 崩溃。要解决您的问题,您有两种选择:

  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];
    

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

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

于 2012-08-05T04:12:28.977 回答
2

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

NSMutableArray *imageFileNameArray;

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

//Create an Array to store image names

NSMutableArray *imageFileNameArray = [[NSMutableArray alloc] init];
于 2012-08-05T08:06:32.443 回答