2

我有一个奇怪的问题(如果你问我很奇怪)。我使用一个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总是返回一个我试图分配给频率的新对象吗?我该如何解决?改变 aNSNumber值的正确方法是什么?

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

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

[__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

4 回答 4

1

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

于 2012-05-09T15:02:20.673 回答
0

我会尝试这样做

int myNumber = ([frequency intValue] + 1);
frequency = [NSNumber numberWithInt:myNumber];
于 2012-05-09T14:43:23.637 回答
0

是的,numberWithInt:确实返回了一个新对象。您可能没有保留此对象。分配frequency新的NSNumber. 如果没有上下文,我不确定实现此目的的最佳方法,但一种方法是创建frequency对象的属性并使用访问器方法。

于 2012-05-09T14:44:32.480 回答
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];
于 2013-06-16T11:56:16.923 回答