EXC_BAD_ACCESS错误

时间:2011-09-27 18:43:11

标签: objective-c ios cocoa-touch exc-bad-access

我在以下行收到错误EXC_BAD_ACESS:

NSString *titleVarName = [[NSString alloc] initWithFormat:@"%@%@",@"occasionTitle",i];

这是上面代码行所在的for循环:

for (i=0; i < count; ++i) 
{

    //Save the occasionS details to NSUserDefaults

    NSString *titleVarName = [[NSString alloc] initWithFormat:@"%@%@",@"occasionTitle",i];

    NSString *dateVarName = [[NSString alloc] initWithFormat:@"%@%@",@"occasionDate",i];

    NSString *imageVarName = [[NSString alloc] initWithFormat:@"%@%@",@"occasionImage",i];


    [[NSUserDefaults standardUserDefaults] setValue:[[[self displayedObjects] objectAtIndex:i]     
title] forKey:titleVarName];

    [[NSUserDefaults standardUserDefaults] setValue:[[[self displayedObjects] objectAtIndex:i]     
date] forKey:dateVarName];

    [[NSUserDefaults standardUserDefaults] setValue:[[[self displayedObjects] objectAtIndex:i] 
imagePath] forKey:imageVarName]; 

    //release

    [titleVarName release];
    [dateVarName release];
    [imageVarName release];


    [self dismissModalViewControllerAnimated:YES];
}

不能分配对象并在for循环中释放它们吗?

3 个答案:

答案 0 :(得分:2)

假设iint,该行应为

NSString *titleVarName = [[NSString alloc] initWithFormat:@"%@%i",@"occasionTitle",i];

%@用于Cocoa对象,而不是像int,float或bool这样的原语;

答案 1 :(得分:2)

您需要使用%d%i说明符而不是%@来指定整数。如果%@与int一起使用,那么它将尝试访问int指定的地址处的对象。例如,如果i的值为1,则它尝试访问地址1处的对象,这将导致错误访问。

NSString *titleVarName = [[NSString alloc] initWithFormat:@"%@%d",@"occasionTitle",i];

此处您不需要allocrelease,但这不是访问不良的原因。您可以使用便利构造函数。

NSString *titleVarName = [NSString stringWithFormat:@"occasionTitle%d", i];
// release not required

dateVarNameimageVarName执行相同操作。

答案 2 :(得分:0)

仅对%@个对象使用NSObject格式说明符。

由于i是代码中的整数,因此必须使用%d%i作为整数。

此外,不需要使用%@包含字符串,您可以直接在格式字符串中使用静态字符串:

NSString *titleVarName = [[NSString alloc] initWithFormat:@"occasionTitle%i",i];