设置整数时为什么会发生EXC_BAD_ACCESS和SIGABRT?

时间:2013-08-20 15:17:16

标签: ios objective-c nsuserdefaults exc-bad-access

我写了代码。

我想使用nsuserdefault保存整数。

但是这段代码发生在EXC_BAD_ACCESS和SIGABRT。


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    ...
    [self desave:[newys integerValue] :[newms integerValue]];
    ...
}

...

- (void)desave:(NSInteger*)year :(NSInteger*)month//←EXC BAD ACCESS happened on this row.
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    [defaults setInteger:year forKey:@"year"];//←SIGABRT happened on this row.

    [defaults synchronize];
}

4 个答案:

答案 0 :(得分:2)

根据您的desave方法签名,您将NSInteger *作为参数传递,其中需要NSInteger。 NSInteger不是从NSObject派生的对象,它是一个原始的。

答案 1 :(得分:2)

问题是由NSInteger参数使用不必要的指针引起的。

变化:

- (void)desave:(NSInteger*)year :(NSInteger*)month

为:

- (void)desave:(NSInteger)year :(NSInteger)month

NSInteger不是班级类型。

您还应该更好地命名您的方法。现在名称是desave::。如果是这样会更好:

- (void)desaveYear:(NSInteger*)year month:(NSInteger*)month

现在名称为desaveYear:month:

现在你可以用:

来调用它
[self desaveYear:[newys integerValue] month:[newms integerValue]];

答案 2 :(得分:0)

您正在将指针传递给NSInteger。解决这个问题的最简单方法是:

- (void)desave:(NSInteger)year :(NSInteger)month
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setInteger:year forKey:@"year"];
    [defaults synchronize];
}

答案 3 :(得分:0)

关于你的方法

- (void)desave:(NSInteger*)year :(NSInteger*)month

您正在发送年和月变量指针。这会发送内存地址。试试这个

- (void)desave:(NSInteger)year :(NSInteger)month
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setInteger:year forKey:@"year"];
    [defaults synchronize];
}