2012-01-05 17 views
0

私のアプリがアドレス帳から電話番号を取得して戻ってきたときに、間違って電話番号以外のものを取得した場合、try catch finalのコードは任意のアイデアを事前に評価され、それをキャッチしません:try catch stop finalは例外をキャッチしていません

*** -[CFDictionary length]: message sent to deallocated instance 0x6a4db70 

コード:

strContact = (NSString *)phone; CFRelease(phone); 
// NSLog(@"%@", strContact); 
CFRelease(multi); 
name = (NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty); 
NSRegularExpression *regex = [[[NSRegularExpression alloc] initWithPattern:@"[a-zA-Z]" options:0 error:NULL] autorelease]; 
// Assuming you have some NSString myString. 
NSUInteger matches = [regex numberOfMatchesInString:strContact options:0 range:NSMakeRange(0, [strContact length])]; 
+2

質問に**コード**を入れてください – PresleyDias

+0

多くの間違いをしないでください。 –

+0

別のcatchブロックが最初にキャッチしていますか? – user1118321

答えて

2

[OK]を今私はあなたの質問を理解すると思います。それはちょうど私にしばらくかかった。

ゾンビオブジェクトが有効(NSZombieEnabled)であると仮定しているので、@ try/@ catch構造を使用してゾンビにメッセージを送信すると、このエラーをキャッチできないのだろうと思います。

NSZombiesはObjective-C例外をスローしません(この方法で捕まえることができます)。とにかくNSZombieEnabledでアプリを実際に出荷することはないので、実際にはその点はありません。これは、デバッガまたはInstruments内で使用するデバッグツールを意味します。

実際のアプリケーションでは、NSZombieをオフにしても、EXE_BAD_ACCESS(これはこのタイプの例外ではありません)というEXE_BAD_ACCESSを取得するだけで、これを捕まえることはできませんレベル)。

最後の点は、Objective-C例外( @ try/@ catchのタイプ)は回復できないと思われるエラーに対してはお勧めできません。つまり、致命的なエラーの場合にのみ、クリーンアップを実行してアプリがクラッシュする可能性があります。

あなたがしようとしていることを行う正しい方法は、実際にテストして、それぞれのケースを取得してから適切に処理することを除いて、異なるタイプまたは異なる値をテストすることです。通常のif/else条件文やそのようなものを使ってこれを行うことができます。必要があればnilの値をテストして、特定のクラスのオブジェクトがあるかどうかを確認することができます[someObj isKindOfClass:[MyExpectedClass class]]

私は質問を正しく理解したらいいですか?

+0

あなたの助けてくれてありがとう、私には最後の質問があります。どのように動作するのでしょうか、その問題は例外ではないということを親切に教えてください。 –

+0

申し訳ありませんが、私はその質問を理解していません。あなたは私に例を挙げることができますか? –

+0

私は、必要に応じて、私のプロジェクトに未知の例外処理の実装を追加することを意味します。http://cocoawithlove.com/2010/05/handling-unhandled-exceptions-and.html第2に、ゾンビと例外の違いは何ですか? –

1

を問題は、あなたがstrContactにそれを割り当てた後phoneを解放し、その後strContactを使用していることはおそらくです。 phoneをリリースすると、文字列オブジェクトの割り当てが解除される可能性があるため、strContactのポインタは無効になります。

0

確かにphoneは文字列ですか?おそらく文字列ではないNSString *ポインタ 'strContact'にそのオブジェクトを格納しているように見えるので、エラーメッセージの 'CFDictionary'になります。

  1. 正しい型のオブジェクトを取得する:あなたが修正するには、2つの問題を抱えているよう

    が見えます。

  2. 必要になる前にオブジェクトを解放しないようにします。オブジェクトの使用が終わったらCFReleaseを入れてみてください!
+0

はい、私はちょうどこの例外がtry catch catch finalにキャッチされない理由を知りたいと思っています。私はphonenumberpropertyのチェックを入れましたが、今はうまく動いています。実際には、将来予期しない例外で例外処理を使用したいのですが、 –

関連する問題