在从地址簿获取电话号码返回我的应用程序时,如果错误地我获取了一些地址或除了电话号码之外的任何东西,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])];
答案 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'。
看起来你有两个问题要解决: