2016-12-22 9 views
2

こんにちは私はいくつかの検証ルールで古いプロジェクトを使っています。iOS objective c substringToIndexクラッシュ

私の問題では、特定の文字が少ないバーコードスキャン文字列がほとんどありません。プログラムは、ここで

if ([[sBarcodeValues substringToIndex:6] isEqualToString:@"2C2C2P"]){ 

} 

が文字列のみ含まれているため、エラーログ(詳細を怒鳴る絵で含まれている)

2016-12-22 14:51:56.019324 SAMKiosk[1008:476815] -[ScanAndPayVC checkBarCodeDetail]: sBarcodeValues 11.10 
2016-12-22 14:51:56.019839 SAMKiosk[1008:476815] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSTaggedPointerString substringToIndex:]: Index 6 out of bounds; string length 5' 
*** First throw call stack: 
(0x1889611b8 0x18739855c 0x188961100 0x189386e80 0x1002ad930 0x1002a8320 0x1002a5bb8 0x19019ca54 0x19019c5f0 0x18b2b1d94 0x18b2d0dcc 0x10070d218 0x100719334 0x100727f94 0x10070f300 0x10071a8ac 0x100710ce0 0x10071205c 0x18890e810 0x18890c3fc 0x18883a2b8 0x18a2ee198 0x18e87a7fc 0x18e875534 0x1000e0414 0x18781d5b8) 
libc++abi.dylib: terminating with uncaught exception of type NSException 
(lldb) 

enter image description here

がかもしれませあるコード

の次の行のためにクラッシュしますチェックが必要な場合は5文字6.このクラッシュを防ぐにはどうすればよいですか?助けは大いに感謝しています。ありがとう

+2

あなたは文字列の長さを超える範囲に直接アクセスしています – Joshua

+0

'if([sBarcodeValues containsString:@" 2C2C2P "])' – iphonic

+1

@iphonicいいえ、それは同じチェックではありません。 – rmaddy

答えて

5

sBarcodeValuesが6文字未満のときにクラッシュが発生することは間違いありません。

あなたは長さのために追加のチェックを追加することができます

if (sBarcodeValues.length >= 6 && [[sBarcodeValues substringToIndex:6] isEqualToString:@"2C2C2P"]) { 
} 

をしたり、単に行うことができます。

if ([sBarcodeValues hasPrefix:@"2C2C2P"]) { 
} 

これはsBarcodeValuesがどのくらいに関係なく動作します。

+0

2C2C2Pが文字列の開始時に動作しますか? – Himanth

+0

@himanthはい、それはhasPrefixがすることです。受信者が指定された文字列で始まる場合は 'YES'を返します。 – rmaddy

+0

これは受け入れる必要があります – Himanth

1

部分文字列の前に文字列の長さを確認することをお勧めします。

あなたは次のようにすることを確認することができます。

if (sBarcodeValues.length>=6 && [[sBarcodeValues substringToIndex:6] isEqualToString:@"2C2C2P"]){ 

} 

編集:

をあなただけsubstringToIndexを使用したい場合は、長さのチェックがクラッシュを防止する必要があります。

そうしないと、hasPrefixが処理を行います。

+0

上記のようにチェックを使用するとお考えですか、私たちのhasPrefixは良いですか? –

+0

はい、 'hasPrefix'は指定された接頭辞の文字列の開始をチェックします。したがって、長さと接頭辞の両方をチェックする方がより良いオプションです@LêKhánhVinh –

関連する問題