【问题标题】:ObjC class method is not called. GDB playing games?未调用 ObjC 类方法。 GDB玩游戏?
【发布时间】:2016-10-06 03:33:32
【问题描述】:

我有一个自定义 UITableViewController,我试图用它来管理 UITableView。我的代码在包含 UITableView 的主 UIViewController 中的流程如下:

    _messagesTableVC = [[AllMessagesTableViewController alloc] init];

    _allMessageTableView.dataSource = _messagesTableVC;
    _allMessageTableView.delegate = _messagesTableVC;

    [_allMessageTableView reloadData];

AllMessagesTableViewController 自定义 UITableViewController 类已初始化,它执行所需的任何处理,我将 _allMessageTableView(UITableView)的委托设置为我的自定义类。

当我运行此代码时,程序的行为就像自定义类不存在但没有发生错误一样。似乎没有调用自定义类中的任何方法,没有 init,没有 initWithCoder,什么都没有(我设置了断点并检查了 ;))。

正如您在下面的屏幕截图中看到的,我在自定义类中的自定义方法refreshData 之后设置了一个断点,我设置为返回YES。我将refreshData 的返回值赋给了一个局部变量test

在调试器中:

  1. _messagesTableVC 自定义类似乎不是零。
  2. test 似乎不存在。
  3. 此处未显示,但当我尝试在调试器中运行[_messagesTableVC refreshData] 时,它显示error: Execution was interrupted, reason: Attempted to dereference an invalid ObjC Object or send it an unrecognized selector. The process has been returned to the state before expression evaluation.。那么_messagesTableVC 实际上是 nil 吗??

是什么导致了这些问题,或者 GDB 正在玩游戏?这是一个消息应用程序扩展,以防万一。谢谢。

更新:这是自定义类 init 和 refreshData 的代码

- (instancetype)init {
    self = [super init];
    if (!self)
        return nil;
    return self;
}

- (BOOL)refreshData {
    return YES;
} 

更新 2:我创建了一个空白的工作项目并将确切的文件复制粘贴到我的原始项目中(因为它是大型 iOS 应用程序的 iMessage 扩展)。事实证明,即使在我清理了项目并更改了 UITableView 委托以提供不同的文本之后,Xcode 仍在运行应用程序的旧版本。

【问题讨论】:

  • 您能发布您的-refreshData 的代码吗?你确定 AllMessagesTableViewController 中的 -init 方法没有被击中吗?或者这不是你的意思?
  • 另外注意,您似乎使用 LLDB 作为调试器,而不是 GDB(但与您的问题 IMO 无关)
  • @AO 我已经更新了我的问题以包括initrefreshData 方法。是的,我创建了简单的 initrefreshData 方法,但奇怪的是什么都没有运行。我也确保导入了正确的文件。
  • 是的,这很奇怪。您介意压缩您的工作区并上传吗?如果我运行您的代码,我可能会找到您的问题。如果你有专有的东西,不要出汗
  • 另外一个注释,在 Objective-c 中使用格式化字符串,%@ 寻找 NSObjectBOOL 是一种原始数据类型,这就是您收到编译器警告的原因。您可以将该行替换为:NSLog(@"Test: %@", test ? @"YES : @"NO")。三元运算符(?)将根据test的状态将字符串设置为“YES”或“NO”

标签: ios objective-c uitableview uiviewcontroller gdb


【解决方案1】:

我过去为同一个项目创建了一个消息扩展,并删除了目标,同时将文件保留在项目中。当我将 Messages Extension 重新添加到项目中时,Xcode 继续运行旧版本的应用程序。 我通过以下方式解决了 Xcode 运行旧版本应用程序的问题:

  1. 全部清理
  2. 从项目中删除消息扩展目标
  3. 将现有的消息扩展代码备份到项目外部的目录中。然后从项目中删除 Messages 应用组和目录。
  4. 从项目中删除消息扩展构建方案。
  5. 删除项目派生数据目录。
  6. 重启Xcode,在项目中新建Messages Extension目标,导入保存的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-06
    • 2020-08-27
    • 1970-01-01
    相关资源
    最近更新 更多