【问题标题】:Objective-C Declaring object as a totally different class than what I declaredObjective-C 将对象声明为与我声明的完全不同的类
【发布时间】:2011-08-27 02:57:51
【问题描述】:

在我编写的一个方法中,我声明了一个“A”类的实例并在其上调用一个方法。在运行时,当方法运行时,我的应用程序崩溃。它说一个无法识别的选择器被发送到一个类“B”的实例,即使我声明了一个“A”的实例。我在某处读到我可能无法正确管理我的内存,因此它将方法发送到另一个类,但我使用的是 ARC,所以这甚至不应该成为问题。非常感谢您的帮助!

The error I'm getting:
2011-08-27 01:25:49.859 Intelligenda[49385:bc03] PVC: <HomeViewController: 0x59359e0>
2011-08-27 01:25:49.945 Intelligenda[49385:bc03] -[HomeViewController addNewClass:]: unrecognized selector sent to instance 0x59359e0
2011-08-27 01:25:49.947 Intelligenda[49385:bc03] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[HomeViewController addNewClass:]: unrecognized selector sent to instance 0x59359e0'

以及被调用的方法:

-(IBAction)done:(id)sender{

    [teacherName resignFirstResponder];
    [className resignFirstResponder];

    IntelligendaAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
    UINavigationController *nav = delegate.navController;

    [nav popViewControllerAnimated:YES];

    ClassesViewController *classesParentViewController = (ClassesViewController *) nav.topViewController;

    ClassIG *theNewClass = [[ClassIG alloc] init];
    theNewClass.className = className.text;
    theNewClass.teacherName = teacherName.text;

    NSIndexPath *indexPath;


    theNewClass.subject = [tableView cellForRowAtIndexPath:indexPath].textLabel.text;



    // add reminder to array
    NSLog(@"PVC: %@", [classesParentViewController description]);

    [classesParentViewController addNewClass:theNewClass];

}

【问题讨论】:

  • 这种类型的错误也常常与内存管理问题有关......如果一个对象已被释放,另一个(不同类的)可能恰好在内存中的相同位置。

标签: objective-c ios memory-leaks automatic-ref-counting


【解决方案1】:

声明一个指针NSArray* fred 什么都不做(除了一些编译时警告消息)来确保fred 是一个NSArray。重要的是您分配给fred 的内容。如果您分配一个NSDateFormatter,那么这就是fred

【讨论】:

  • 是的,但是什么?如果您从一个方法(不是该类的分配/初始化)中获得一个指针,您确定您获得的是预期的类类型吗?特别是如果您从 XML 或 JSON 解析中获取值,它们可能不是您所期望的。 (“无法识别的选择器”消息会告诉你你真正得到了什么类。)
  • 今天凌晨 1 点左右我正在阅读您的答案,我并没有完全理解它。不过,我现在这样做了,它非常有帮助!我如何更改navtopViewController
  • UINavigationController topViewController 将返回“顶部”的任何控制器。如果它不能识别addNewClass,那么您会收到错误消息。您有责任了解最重要的内容或测试您从通话中得到的信息 (if([classesParentViewController isKindOfClass:[ClassesViewController class]) ...) 以确保它是您想要的。
【解决方案2】:

您假设应用程序委托的导航控制器顶部有一个ClassesViewController 显然是有缺陷的。它的顶部有一个HomeViewController。你的结构看起来可能有点复杂,因为你有一个按钮连接到控制器类的其他部分的动作,所以可能有很多原因。

首先要检查:如果您以编程方式实例化按钮,那么您是否不小心将按钮添加到了错误的控制器?如果您使用图形界面设计器设计所有内容,但将其保存在单个 NIB 中,是否有可能您复制并粘贴了一个按钮而忘记更改它的连接方式?

如果您最终可以使用多个导航控制器,您确定应用程序委托持有的那个当前在屏幕上吗?

【讨论】:

    【解决方案3】:

    简短的回答是类型转换和类型转换是 objc 中程序员的练习。

    在这里阅读我的答案:

    Passing NSNumber* to NSString* expected-parameter does not cause compiler warning / error

    ...有关声明/强制转换对象变量与其他语言有何不同以及如何检测这些情况的更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-21
      • 2021-06-10
      • 1970-01-01
      • 2011-07-08
      相关资源
      最近更新 更多