2012-05-09 9 views
2

私は奇妙な問題があります(私に尋ねると奇妙です)。 Im NSNumberオブジェクトを使用して数値を格納する(doh)。私が "修正"しようとすると、アプリケーションがクラッシュします。私はこのようになります使用していたコード:周波数が、私は値にこれが呼び出されるたびに書き込むためのNSNumberとfreqLabel私のラベルですNSNumberがSIGABRTを引き起こします

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 numberWithIntは、常に私が周波数に割り当てようとしている新しいオブジェクトを返しますか? これを修正するにはどうすればよいですか? NSNumberの値を変更する正しい方法は何ですか?

私の悪い英語のために申し訳ありません(間違いがある場合)。

EDIT: エラー・ログには、次のようになります。

[__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に保存する必要がありますか?

+0

エラーは何ですか? – Zepplock

+0

NSLog(@ "%@"、頻度); 'を' if'の前に追加して、何が印刷されるのか教えてください。 – dasblinkenlight

+0

@ Zepplock私は投稿を編集しました。 dasblinkenlight通常の値を表示します。 – Majster

答えて

1

あなたは/ initを何か一度だけ割り振ることはできません。そして、そのタイプに対する生涯の参照があります。 numberWithIntに周波数を割り当てると、の前回のalloc/init値をの自動解放値(これは後でリリースされ、記述している正確な動作を引き起こす)で上書きします。 self.frequencyで動作する理由は、プロパティがretainプロパティとして設定されているため、自動的にautorelease値を保持するためです。あなたのnumberWithInt行にretainを追加すれば、それはうまくいくでしょう(あるいは今self.frequencyを使って何をしているのか)。

+0

はい。どうもありがとうございました。私はついにこの「保持する」ことを理解する。今、私は最終的になぜオブジェクトを宣言するときに '(nonatomic、retain)'を置いているのかを知っています。それはちょうど "チュートリアルがそう言っている"前であった。私はまだ若く、学習しています:) – Majster

+0

@Majster ARCでは、retainキーワードはほとんど無関係になります。 – borrrden

+0

はい私は同意します。しかし、私はまだ自分自身を「ガベージコレクタ」として好んでいます。私はARCほど効率的ではないかもしれないが、少なくとも私がメモリを使って何をしているかは知っている(または思っていると思う)。 – Majster

0

私は、これは代わりに

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

これは同じエラーを引き起こしています。 – Majster

0

はい、numberWithInt:は確かに新しいオブジェクトを返すんやっしようとするだろう。あなたはおそらくこのオブジェクトを保持していません。新しいNSNumberを割り当てる場合は、frequencyを正しく保持してください。コンテキストがなければ、私はこれを達成するための最良の方法は不明ですが、1つの方法は、オブジェクトのプロパティとアクセサメソッドを使用してfrequencyにすることです。

+0

アイデアはありますが、もっと簡単に説明してください。どのように私は適切に '周波数'を保持する必要がありますか?'frequency'は私のクラス変数とプロパティです。このように合成すると、 '@synthesize frequency = frequency'というようになります。これも間違っていますか? :) – Majster

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]; 
関連する問題