Ali
Ali

Reputation: 4245

EXC_BAD_ACESS error

I get that error EXC_BAD_ACESS at the following line:

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

Here is the for loop where the above code line is located:

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

Isn't ok to alloc objects and release them inside a for loop?

Upvotes: 0

Views: 165

Answers (3)

taskinoor
taskinoor

Reputation: 46027

You need to use %d or %i specifier instead of %@ to specify an integer. If %@ is used with int then it will try to access the object at the address specified by the int. For example, if the value of i is one then it is trying to access the object at address one which will cause a bad access.

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

And also you don't need alloc and release here, though that is not the reason of bad access. You can use a convenience constructor.

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

Do the same for dateVarName and imageVarName too.

Upvotes: 2

AliSoftware
AliSoftware

Reputation: 32681

Use the %@ format specifier only for NSObject objects.

As i is an integer in your code, you have to use %d or %i for integers.

Moreover, there is no need to include the string using %@, you can use the static string directly in your format string:

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

Upvotes: 0

edc1591
edc1591

Reputation: 10182

Assuming i is an int, that line should be

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

%@ is used for Cocoa objects, not primitives like an int, float or bool;

Upvotes: 2

Related Questions