意外的EXC_BAD与NSNumber

时间:2011-01-31 06:23:33

标签: iphone ipad ios exc-bad-access

我正在尝试观察视图的BOOL属性。 因为有不同类型的视图要观察,我检查选择器并使用performSelector来获取值。

if( [tab respondsToSelector:@selector(canGoBack)] ) {
  [tab addObserver:self forKeyPath:@"canGoBack" 
    options:NSKeyValueObservingOptionNew 
    context:NULL];
  NSNumber* value = (NSNumber*)[tab performSelector:@selector(canGoBack)];
  canGoBack = [value boolValue];
}

但是,我在“[value boolValue]”意外得到了EXC_BAD。 我检查了选项卡,它在错误发生时确实存在。

将代码更改为以下内容后,错误再次被捕获。

  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];
  }

我想知道,为什么?

3 个答案:

答案 0 :(得分:0)

我认为你使用canGoBack作为函数,也作为bool值。这就是问题所在。

答案 1 :(得分:0)

因为您的方法canGoBack返回BOOL,而performSelector:则返回id类型的返回值。 BOOL的结果将不是有效的objc对象的地址,您将其转换为,然后用于发送带有的objc消息。

答案 2 :(得分:0)

canGoBack是选择器方法,你试图为该方法分配一个bool值?怎么可能? 第二个想想,你确定你获得的NSNumber只有1或0,否则强制转换NSNumber t o bool并不是完整的