NSNumber导致SIGABRT

时间:2012-05-09 14:34:57

标签: iphone objective-c ios nsnumber

我有一个奇怪的问题(如果你问我就很奇怪)。我使用NSNumber对象来存储数字(doh)。当我尝试“修改”它时,它会崩溃我的应用程序。我正在使用的代码如下所示:

if ([frequency intValue] > 19999)
    return;
frequency = [NSNumber numberWithInt:([frequency intValue] + 1)]; //I think this line is causing me the problem
[freqLabel setText:[NSString stringWithFormat:@"%i Hz", [frequency intValue]]];

NSNumber和freqLabel的频率在哪里频率我每次调用时都会写入值。 为什么这不正确?它在我第一次打电话时起作用。是NSNumber numberWithInt总是返回一个我想要分配给频率的新对象吗? 我该如何解决?什么是更改NSNumber值的正确方法?

抱歉我的英语不好(如果有任何错误)。

编辑: 错误日志如下所示:

[__NSCFType intValue]: unrecognized selector sent to instance 0x73430e0
2012-05-09 16:39:28.064 MyApp[31939:10703] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFType intValue]: unrecognized selector sent to instance 0x73430e0'
*** First throw call stack:
(0x17a6022 0x28afcd6 0x17a7cbd 0x170ced0 0x170ccb2 0x4821 0x17a7e99 0x49d14e 0x49d0e6 0x543ade 0x543fa7 0x543266 0x4c23c0 0x4c25e6 0x4a8dc4 0x49c634 0x2e49ef5 0x177a195 0x16deff2 0x16dd8da 0x16dcd84 0x16dcc9b 0x2e487d8 0x2e4888a 0x49a626 0x1cca 0x1c15)
terminate called throwing an exception

但它并不总是显示此错误。有时会导致EXC_BAD_ACCESS。我应该将我的变量存储在临时NSNumber吗?

4 个答案:

答案 0 :(得分:1)

你不能只是分配/初始化一次,然后你终身引用该类型。当您为numberWithInt分配频率时,您使用 autorelease 覆盖以前的alloc / init值(稍后会释放并导致您描述的确切行为) 。它与self.frequency一起使用的原因是因为您的属性被设置为retain属性,因此它会自动保留autorelease值。在numberWithInt行中添加一个retain,它就可以了(或者用self.frequency做你正在做的事情)。

答案 1 :(得分:0)

我会尝试这样做

int myNumber = ([frequency intValue] + 1);
frequency = [NSNumber numberWithInt:myNumber];

答案 2 :(得分:0)

是的,numberWithInt:确实会返回一个新对象。你可能没有保留这个对象。在为其分配新frequency时,只需正确保留NSNumber即可。没有上下文,我不确定实现此目的的最佳方法,但一种方法是使frequency成为对象的属性并使用访问器方法。

答案 3 :(得分:0)

看起来你已经初始化并在NSNumber之前分配了一些值,就像你在数组中一样。

基本上NSNumber对象是不可变的,因此无论如何都不可能改变它们的值。 如果在数组中使用它,可以执行此解决方法:

NSMutableArray *myOldArray = [[NSMutableArray alloc] init];
myOldInt = 3;
myOldArray[4] = [NSNumber numberWithInt:myOldInt]; // for example

NSMutableArray *myNewArray = [[NSMutableArray alloc] init];
myInt = myOldInt+2; 

NSMutableArray *row = [NSMutableArray arrayWithObjects:myOldArray[1],myOldArray[2],myOldArray[3],[NSNumber numberWithInt:myInt],[NSNumber numberWithInt:myInt2],nil];

[myNewArray addObject:row];