【问题标题】:How to know whether the object is alive or not in Objective c With ARC如何在Objective c中使用ARC知道对象是否还活着
【发布时间】:2013-03-02 07:59:20
【问题描述】:

嗨,在我的 iPad 应用程序中,我正在使用搜索栏和 tableview,搜索完成后,我在 tableview 中显示结果。为了用新的搜索结果更新表格,我正在调用 reloadData 方法。它工作正常,但在少数情况下,应用程序在 [tableviewobject reloaddata] 方法处崩溃,我在控制台中收到此错误

对象 0x95a0300 的错误:未分配被释放的指针 * 在 malloc_error_break 中设置断点进行调试。

通过观察上述错误,我了解到 tableviewobject 已从内存中删除。我将消息发送到释放的对象。为了克服这个问题,我所做的是在将消息 reloadData 传递给 tableviewobject 之前分配内存

tableviewObject=[[UITableView alloc]init];
tableviewObject.delegate=self;
tableview.datasource=self;
[tableviewObject reloaddata];.

在结果数据未在 tableview 中更新的情况下。现在我想知道的是如何知道对象是活着的还是从内存中释放出来的。如果它释放了如何为表视图对象分配内存以重新加载搜索结果数据。如果有人有任何想法,请为此提供解决方案。提前谢谢请帮帮我。

注意:在我的项目中,我使用的是 ARC。

【问题讨论】:

  • 读取这个错误发生的方式有多少stackoverflow.com/questions/1424210/…
  • 它也可能是在调用 reloadData 时通过表视图数据源访问的任何已释放的对象,不一定是您的实际表视图。我的猜测是源数组中的一个对象已被释放,关键是确保在释放它时将其从数据源数组中删除,以免发生这种情况。但是,所有这些都只是猜测,因为您没有包含任何代码。如果您真的需要帮助,请告诉我们您在做什么。 :)
  • 如果你能在模拟器上重现问题,在僵尸仪器下运行。如果您只能在设备上执行此操作,请转到 Product > Scheme > Edit Scheme... > Run > Diagnostics 并选中“Enable Zombie Objects”复选框。
  • 您使用了多少个表格视图?你是单独使用 UISearchBar 还是和 UISearchDisplayController 一起使用?

标签: iphone uitableview search automatic-ref-counting


【解决方案1】:

您没有注意到第三行中 UITableView 的名称拼写错误吗?

tableviewObject=[[UITableView alloc]init];
tableviewObject.delegate=self;
tableview.datasource=self;
[tableviewObject reloaddata];

应该是tableviewObject.datasource=self;

此外,为什么每次都创建新对象?你会因此失去旧的!只需第一次也是唯一一次在 viewDidLoad 方法中初始化它

【讨论】:

    【解决方案2】:

    作为解决方案的更通用方法:

    如果您使用 ARC,则需要保留对象,否则它们会为您释放。
    在上面的示例中(假设您还打算分配 tableviewObject.datasource),您将需要一些属性或类成员来保存对您的 tableviewObject 的引用。 例如:

    @interface MyViewController()  //anonymous private properties inside your .m
    @property(nonatomic,strong) UITableView *tableviewObject;
    @end
    
    @implementation MyViewController
    @synthesize tableviewObject;
    // rest of your implementation ...
    @end
    

    这样你可以使用 self.tableviewObject 但只要具有该属性的 UIViewController 处于活动状态,它就会保持可用。

    要记住的一般情况是,如果您不想阻止 ARC 发布某些人必须使用它的东西(引用或成员属性算作 “使用”) .

    在这方面,thalador / user2413007 的回答也是正确的,因为出口将引用加载的 XIB 中的 tableview,它基本上具有相同的结果。

    【讨论】:

      【解决方案3】:

      不要在代码中创建 UITableView 对象,你会失去视图之间的链接,如果你创建这样的对象将无助于你可以创建这样的属性

      @property(nonatomic,strong)IBOutlet UITableView *tableView; 
      

      我想这会解决你的问题。

      【讨论】:

      • 在代码中创建对象并没有错,只要你写得正确并建立正确的连接。
      • @Abizem 在上面的代码中,当他想要执行重新加载时,他正在创建对象。而且他没有将 tableview 添加到实际视图中。那么它是如何链接的 ..
      • 这就是为什么我说你首先需要正确编写它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-27
      相关资源
      最近更新 更多