попробуй поймай финал не лови исключение - PullRequest
0 голосов
/ 05 января 2012

При возврате в мое приложение получения номера телефона из адресной книги, если по ошибке я получаю какой-либо адрес или что-либо, кроме номера телефона, код в финале попытки получения дает следующее, но не перехватывает его, любой идея ценится заранее:

  *** -[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 ]

2 голосов
/ 05 января 2012

Ладно, теперь я понимаю ваш вопрос.Это заняло у меня некоторое время.

Итак, я предполагаю, что у вас включены объекты Zombie (NSZombieEnabled), и вы задаетесь вопросом, почему вы не можете поймать эту ошибку - отправка сообщения зомби--со структурой @ try / @ catch.

Краткий ответ: NSZombies не выдает исключение Objective-C (которое вы можете поймать таким образом).В этом не было бы никакого смысла, так как в любом случае вы не поставили бы приложение с NSZombieEnabled.Это должен быть инструмент отладки, который вы используете в отладчике или в инструментах.

В вашем реальном приложении, когда вы выключаете NSZombie, все равно не будет исключения для этого, так как выпросто получил бы EXE_BAD_ACCESS, который является сигналом UNIX (не этот тип исключения на этом уровне).

Последний пункт - это исключения Objective-C (тип, который вы можете @ try / @ catch) не рекомендуются для ошибок, от которых вы ожидаете восстановления.Или, другими словами, это предназначено только для фатальных ошибок, когда вы можете выполнить некоторую очистку и затем позволить своему приложению все еще падать.

Правильный способ сделать то, что вы пытаетесь сделать, - это на самом деле проверитьдля разных типов или разных значений, которые вы можете получить, кроме как получить, а затем обработать каждый случай соответствующим образом.Вы можете сделать это, используя обычные условные выражения if / else или что-то в этом роде.Вы можете проверить значения для nil, если вам нужно, и вы можете увидеть, принадлежит ли объект к определенному классу, используя [someObj isKindOfClass:[MyExpectedClass class]]

Надеюсь, я правильно понял вопрос?

1 голос
/ 05 января 2012

Возможно, проблема в том, что вы освобождаете phone после присвоения ему strContact, а затем используете strContact.Строковый объект, вероятно, освобождается, когда вы отпускаете phone, поэтому указатель в strContact больше не действителен.

0 голосов
/ 05 января 2012

Вы уверены, что phone это строка? Похоже, вы сохраняете этот объект в указателе NSString * strContact, который, вероятно, не является строкой, следовательно, CFDictionary в сообщениях об ошибках.

Похоже, вам нужно решить две проблемы:

  1. Получение объекта нужного типа.
  2. Обеспечение того, чтобы вы не отпускали объекты раньше, чем вам это нужно. Попробуйте поставить CFRelease после того, как вы закончили использовать объект!
...