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頻度に割り当てようとしている新しいオブジェクトを常に返すのですか?これを修正するにはどうすればよいですか?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

4 に答える 4

1

何かを一度だけ割り当て/初期化することはできません。そうすれば、そのタイプへの生涯にわたる参照が得られます。numberWithIntに頻度を割り当てると、前のalloc / init値がautorelease値で上書きされます(これは後で解放され、説明している正確な動作を引き起こします)。self.frequencyで機能する理由は、プロパティが保持プロパティとして設定されているため、自動解放値が自動的に保持されるためです。numberWithInt行に保持を追加すると、問題ありません(または、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。コンテキストがないと、これを実現する最善の方法はわかりませんが、1つの方法は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 に答える