[__NSCFNumber isEqualToString:]:发送到实例的无法识别的选择器

时间:2012-06-14 22:19:34

标签: iphone cocoa-touch

我正在尝试在用户接受位置共享后显示视图。这是代码:

-(void) locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
    if (status == kCLAuthorizationStatusDenied) {
        NSLog(@"Denied");
    }
    else if (status == kCLAuthorizationStatusAuthorized) {
        NSLog(@"Accepted!");
        AlertViewController *aViewController = [[AlertViewController alloc] initWithNibName:@"AlertViewController" bundle:nil];
        aViewController.view.frame = CGRectMake(0, 0, 320, 460);
        aViewController.view.backgroundColor = [UIColor colorWithWhite:0 alpha:0.5];
        AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
        [appDelegate.window addSubview:[aViewController view]];
    }
}

但我在第*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFNumber isEqualToString:]: unrecognized selector sent to instance 0xee6fc90'

时出现aViewController.view.frame = ...错误

我在aViewController声明之后放置断点并验证0x00000不是alloc。我似乎无法弄清问题是什么。请提出解决方案。

3 个答案:

答案 0 :(得分:3)

我怀疑xib文件或AlertViewController的视图初始化例程(即viewDidLoad或loadView)存在问题。我可以推断设置框架的线路崩溃的唯一方法是,它是第一次访问视图属性,并且视图被延迟加载。

我怀疑如果你换了

aViewController.view.frame = CGRectMake(0, 0, 320, 460);

UIView *aVCView = aViewController.view;
aVCView.frame = CGRectMake(0, 0, 320, 460);

然后你会在第一行看到崩溃,而不是第二行。

为了进一步调试,我会使用AlertViewController的viewDidLoad或类似的中断。并仔细检查xib中的所有内容。

答案 1 :(得分:2)

您看到的错误意味着您或框架正在尝试获取NSNumber的长度。它们没有长度

要缩小范围,您应该使用异常断点:

  1. 切换到断点导航器。
  2. 点击左下方的+按钮。
  3. 选择添加例外断点...
  4. 点击完成。 (默认值为例外:全部休息:投掷。正是您想要的。)
  5. 运行,这次调试器将在抛出异常时中断,而不是等待它被展开并且应用程序被终止。你会得到一个更多更好地了解实际发生的事情。

    一些可能性:

    1. 您正在为NSNumber属性分配NSString,例如textview的text。似乎调整视图上的框架是触发它的原因,但是bug存在于其他代码中。
    2. 您正在使用ARC,并且您在容器类或其他形式中有一个“弱”但没有归零的对象。它被处理掉并替换为NSNumber,但其他代码试图访问该生命周期后该位置的字符串。
    3. 您有一个自定义视图子类,它将NSNumber视为一个字符串。
    4. 但这种猜测相当无用。在发生异常的地方停止调试器;问题可能会变得很明显。

答案 2 :(得分:0)

在条件语句中,status是什么类型的?您可能使用了错误的运算符或方法。例如,如果statusintboolfloat,则可以使用==。如果是字符串,则使用isEqualToString,如果是通用对象,则只能使用isEqual:。还有isEqual:函数的专用版本,例如isEqualToArray

希望这有帮助!