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

我写了代码。

我想用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]; } 

基于你的desave方法签名,你传递一个NSInteger *作为一个参数,NSInteger是预期的。 NSInteger不是从NSObject派生的对象,它是一个原始的。

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

更改:

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

至:

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

NSInteger不是类的types。

你也应该把你的方法说得好一点。 现在名字是desave:: 。 如果是这样会更好:

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

现在名字是desaveYear:month:

现在你可以打电话给:

 [self desaveYear:[newys integerValue] month:[newms integerValue]]; 

你传递一个指向NSInteger的指针。 解决这个问题最简单的方法是:

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

在你的方法

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

您正在发送年份和月份variables指针。 这发送内存地址。 试试这个

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