2012-01-05 208 views
0

雖然返回到我的應用程序從通訊錄中獲取電話號碼,如果我錯誤地獲取一些地址或除電話號碼以外的任何東西,try catch catch中的代碼給出以下但不抓住它,任何想法表示讚賞提前:嘗試捕捉最後不捕捉異常

*** -[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 2012-01-05 04:39:05

+0

中放一些**代碼**不要犯這麼多錯誤。 – 2012-01-05 04:41:57

+0

另一個catch塊是否會首先捕獲它,也許? – user1118321 2012-01-05 04:43:57

回答

2

好的,我想我現在明白你的問題了。它只是花了我一段時間。所以,我假設你有殭屍對象啓用(NSZombieEnabled),你想知道爲什麼你不能捕捉到這個錯誤 - 發送一個消息給一個殭屍 - 一個@ try/@ catch結構。

簡短的回答是NSZombies不會拋出一個Objective-C異常(你可以用這種方式捕獲這個異常)。實際上並沒有什麼意義,因爲無論如何你都不會真的用NSZombieEnabled發佈應用程序。這是一個調試工具,您可以在調試器或儀器中使用。

在您的實際應用程序中,當您關閉NSZombie的時候,仍然不會有例外,因爲您只會得到一個EXE_BAD_ACCESS,這是一個UNIX信號(不是這種類型的異常水平)。

最後一點是Objective-C異常(您可以使用可以執行的類型 @ try/@ catch)不適用於您希望能夠從中恢復的錯誤。或者換句話說,這只是針對致命錯誤,您可能需要進行一些清理,然後讓應用程序仍然崩潰。

要做的事情的正確方法是實際測試不同的類型或不同的值,您可能除了要獲取並隨後處理每個案例。你可以使用普通的if/else條件或類似的東西來做到這一點。如果需要,您可以測試nil的值,並且您可以通過使用[someObj isKindOfClass:[MyExpectedClass class]]

看到對象是否屬於特定類別我希望我能正確理解該問題嗎?

+0

感謝您的幫助,您瞭解了我,最後一個問題,我正在處理未捕獲的異常處理,我不知道它會如何工作,你會好好告訴我,問題在於它沒有任何異常。我會怎樣稱呼它, – 2012-01-05 06:45:47

+0

對不起,我不明白這個問題。你可以給我一個例子嗎? – 2012-01-05 06:52:24

+0

我的意思是我將未捕獲的異常處理的實現添加到我的項目,在必要的地方http://cocoawithlove.com/2010/05/handling-unhandled-exceptions-and.html其次我想問問殭屍和異常之間有什麼區別。 – 2012-01-05 06:59:00

1

這個問題可能是你正在將其分配給strContact後釋放phone,然後使用strContact。當您釋放phone時,字符串對象可能會被釋放,因此strContact中的指針不再有效。

0

你確定phone是一個字符串嗎?看起來你正在將該對象存儲在NSString *指針'strContact'中,該指針可能不是字符串,因此錯誤消息中的'CFDictionary'。

看起來你有兩個問題來解決:

  1. 獲得正確類型的對象。
  2. 確保您在需要之前不釋放對象。嘗試完成使用對象後放置CFRelease!
+0

是的,我知道了,我只是想知道爲什麼這個異常沒有抓住try catch final。我只對現在工作正常的phonenumberproperty進行了檢查,其實我想在以後意外的異常中使用異常處理 – 2012-01-05 05:30:28