2010-12-29 1 views
3

なぜ '[self.pickerSubArray indexOfObject:self.txtSubCategory.text]'が返されます '2147483647';同じ文字列値の引数 '[self.pickerSubArray indexOfObject:@ "Mark"]'は必要に応じて4を返しますか?なぜ '[self.pickerSubArray indexOfObject:self.txtSubCategory.text]'が '2147483647'を返しますか?

+1

2147483647は、最大32ビットの整数値です。 – ceejayoz

+2

表示される値は、おそらく 'NSNotFound'(0x7FFFFFFFであると定義されている)です。これは、値が配列内に見つからないことを示します。 – Dirk

答えて

13

アップルのドキュメントNSArray(あなたのオブジェクトは名前に基づいていると仮定しています)は次のように言いますindexOfObject:は、オブジェクトが配列内のanyと一致しない場合はNSNotFoundを返します。 NSNotFound自体はNSIntegerMaxと定義されていますが、他の人が指摘しているように、あなたが戻ってくる価値があります。

indexOfObject: を使用して項目を比較します。したがって、テキストが同じであれば、それは機能するはずです。おそらく、実際のテキストは、大文字と小文字(「マーク」と「マーク」)または余分なパディング(「マーク」と「マーク」)など、気づいていない方法で実際には異なります。

+0

最初の唯一の正しい答えをお祝いします。 – Chuck

+0

ありがとう、私をたくさん助けました –

-2

数字の起点については、ちょっと推測すると、これは不正な整数変換です。それはおそらく-1を返すことを意味していました。

そのようなものは、あなたが基礎となる図書館/言語にいくつかの悪い点を見つけた可能性があると私に信じさせます。

+0

ライブラリを非難するのは早すぎます。ここではコーディングエラーが発生することがたくさんあります。例えばindexOfObject:が何を返すのかを誤解し、オブジェクトの等価性をどのように決定するのか。 –

+0

'indexOfObject:'によって返される値は、一致するものが見つからない場合は0x7ffffffffに定義された 'NSNotFound'です。私は、それがOPが得ているものだと思います。 -1〜0xffffffffは異なる番号です。 – Dirk

+3

'NSArray'の' indexOfObject: 'メソッドがとても壊れていた場合、iPhoneやMacが起動すると思いますか? – bbum

-1

indexOfObject:正確なオブジェクトが見つからない場合は、NSNotFoundを返します。 NSNotFoundは、NSIntegerMaxと定義され、2147483647です。

なぜそれが行われますか? indexOfObject:同じ内容のオブジェクトではなく、同じオブジェクトをテストします。例:

NSString *mark1 = [NSString stringWithString:@"Mark"]; 
NSString *mark2 = [NSString stringWithString:@"Mark"]; 

mark1は、2つの異なるオブジェクトであるため、mark2と必ずしも同じではありません。

NSString *mark1 = [NSString stringWithObject:@"Mark"]; 
NSString *mark2 = mark1; 

mark1はmark2と同じです。

BUT!コンパイラはメモリフットプリントを最小限に抑えるため、コード内のすべてのリテラル文字列を1つの定数文字列に変換します。だから[[NSArray arrayWithObject:@"Mark"] indexOfObject:@"Mark"]が動作しますが、textField.textのテキストが "Mark"であっても[[NSArray arrayWithObject:@"Mark"] indexOfObject:textField.text]は機能しません。

どのように修正しますか?indexOfObject:ドキュメントからはindexOfObjectのように見えます:isEqualに基づいています:[self.txtSubCategory.text isEqual:@ "Mark"]。それ以降は、indexOfObjectを使わないようにリファクタリングする必要があるかもしれません。

+0

http://developer.apple.com/library/ios/#documentation/cocoa/reference/foundation/Classes/NSArray_Class/NSArray.htmlを参照してください: "isEqualの場合、オブジェクトは等しいとみなされます:YESを返します。" – Dirk

+0

Kennyに感謝します。あなたはそれをすべて言った。私はどこかで切断する必要があります。モーダルviewController上にあるためかもしれません。まだチェックを知らない。 – akeem

+0

いいえ - ケニーの答えが間違っています。 NSArrayは 'isEqual:'を使用してオブジェクトの等価性を判定し、そのメソッドの動作は非常によく文書化されています。コンパイラの最適化では、*あなたの問題とは何も関係ありません。 – bbum