尝试捕获终于没有捕获异常

时间:2012-01-05 04:37:01

标签: iphone objective-c xcode exception try-catch

在从地址簿获取电话号码返回我的应用程序时,如果错误地我获取了一些地址或除了电话号码之外的任何东西,try catch 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])];

3 个答案:

答案 0 :(得分:2)

好的,我想我现在明白你的问题。它花了我一段时间。

所以,我假设您启用了Zombie Objects(NSZombieEnabled),并且您想知道为什么您无法捕获此错误 - 使用@ try / @ catch结构向僵尸发送消息。< / p>

简短的回答是NSZombies不会抛出Objective-C异常(你可以用这种方式捕获)。实际上并不是那么重要,因为无论如何你都不会真正发布带有NSZombieEnabled的应用程序。这是您在调试器或Instruments中使用的调试工具。

在你的实际应用程序中,当你关闭NSZombie时,仍然没有异常可以捕获这个,因为你只会得到一个EXE_BAD_ACCESS,这是一个UNIX信号(在这个级别不是这种类型的异常) )。

最后一点是,对于您希望能够从中恢复的错误,不建议使用Objective-C异常( @ try / @ catch类型)。或者换句话说,这仅适用于致命错误,您可以进行一些清理,然后让您的应用仍然崩溃。

正在尝试做的事情的正确方法是实际测试不同的类型或不同的值,除了获取然后适当地处理每个案例。你可以使用普通的if / else条件或类似的东西来做到这一点。如果需要,您可以测试nil的值,并且可以使用[someObj isKindOfClass:[MyExpectedClass class]]

查看对象是否属于特定类

我希望我能正确理解这个问题?

答案 1 :(得分:1)

问题可能是您在将phone分配给strContact之后发布strContact,然后使用phone。释放strContact时,字符串对象可能会被取消分配,因此{{1}}中的指针不再有效。

答案 2 :(得分:0)

您确定phone是字符串吗?看起来你正在将该对象存储在NSString *指针'strContact'中,该指针可能不是字符串,因此错误消息中的'CFDictionary'。

看起来你有两个问题要解决:

  1. 获取正确类型的对象。
  2. 确保在需要之前不释放对象。在使用完对象后尝试放置CFRelease!