在下面的方法中,我在包含“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;
}
答案 0 :(得分:6)
您的问题与ARC无关。 NSInteger
不是类,因此您不希望使用%@
格式。 %@
将发送一个description
方法给系统认为是一个对象,但是当它结果不是一个时 - CRASH。要解决您的问题,您有两种选择:
您可能需要:
NSString *urlString =
[NSString stringWithFormat:@"http://foo.example.com/image?quantity=%d",
*count];
确保count
指针首先有效!
您可能需要将方法签名更改为:
-(NSMutableArray *)fetchImages:(NSInteger)count;
然后更改urlString
行,如下所示:
NSString *urlString =
[NSString stringWithFormat:@"http://foo.example.com/image?quantity=%d",
count];
您还需要修复所有呼叫者以匹配新签名。
第二种选择对我来说似乎更“正常”,但如果没有更多的程序,就不可能更具体。
答案 1 :(得分:2)
你也可能想要分配和初始化
NSMutableArray *imageFileNameArray;
在向其添加对象之前,否则您将继续崩溃。所以你有
//Create an Array to store image names
NSMutableArray *imageFileNameArray = [[NSMutableArray alloc] init];