Я пытаюсь наблюдать свойство BOOL вида. Поскольку существуют различные виды наблюдения, я проверяю селектор и использую функцию Performlect, чтобы получить значение.Неожиданный EXC_BAD с NSNumber
if([tab respondsToSelector:@selector(canGoBack)]) {
[tab addObserver:self forKeyPath:@"canGoBack"
options:NSKeyValueObservingOptionNew
context:NULL];
NSNumber* value = (NSNumber*)[tab performSelector:@selector(canGoBack)];
canGoBack = [value boolValue];
}
Однако, я случайно получил EXC_BAD в «[value boolValue]». Я проверил вкладку, она существовала, когда произошла ошибка.
После того как я изменил код на следующее, ошибка никогда не была поймана снова.
if([tab respondsToSelector:@selector(canGoBack)]) {
[tab addObserver:self forKeyPath:@"canGoBack"
options:NSKeyValueObservingOptionNew
context:NULL];
canGoBack = [tab canGoBack];
// NSNumber* value = (NSNumber*)[tab performSelector:@selector(canGoBack)];
// canGoBack = [value boolValue];
}
Интересно, почему?
Если это случайный адрес, почему значение всегда правы, когда нет EXC_BAD? Есть ли механизм автоматического литья? – Slavik
@Slavik адрес может быть предсказуемым, но бесполезен и определенно будет вызывать неопределенное поведение, если вы попытаетесь использовать подписанный результат char как объект objc. в этом случае автоматическое преобразование не выполняется, потому что нельзя использовать символ char как объект objc. вы можете создать свою собственную функцию, которая использует NSInvocation (или интерфейсы в 'obc /'), если вы хотите добиться чего-то функционально сопоставимого. – justin
Спасибо. BTW, есть ли комментарий для поведения performSelector, когда возвращаемое значение не является NSObject. – Slavik