我在以下行收到错误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循环中释放它们吗?
答案 0 :(得分:2)
假设i
是int
,该行应为
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];
此处您不需要alloc
和release
,但这不是访问不良的原因。您可以使用便利构造函数。
NSString *titleVarName = [NSString stringWithFormat:@"occasionTitle%d", i];
// release not required
对dateVarName
和imageVarName
执行相同操作。
答案 2 :(得分:0)
仅对%@
个对象使用NSObject
格式说明符。
由于i
是代码中的整数,因此必须使用%d
或%i
作为整数。
此外,不需要使用%@
包含字符串,您可以直接在格式字符串中使用静态字符串:
NSString *titleVarName = [[NSString alloc] initWithFormat:@"occasionTitle%i",i];