2013-03-14 45 views
4

嗨,在我的iPad应用程序中,我正在使用搜索栏和tableview,搜索完成后我在tableview中显示的结果。为了用新的搜索结果更新表,我打电话给reloadData方法。它工作正常,但在少数情况下的应用程序是在[tableviewobject reloaddata]方法崩溃,我得到这个错误控制台如何知道目标c中是否存在对象用ARC

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

通过观察上述错误我明白了什么是tableviewobject被从内存中删除。我将消息发送给释放的对象。序来克服这个问题,我所做的是我传递消息reloadData之前分配内存以tableviewobject这样

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

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

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

+0

阅读有多少这种错误发生的方式http://stackoverflow.com/questions/1424210/iphone-development-pointer-being-freed-was-not-allocated – Tirth 2013-03-14 04:46:54

+1

它也可能是任何被访问的对象通过你的表视图数据源,当reloadData被调用时已经被释放,而不一定是你实际的表视图。我的猜测是,你的源数组中的一个对象已经被释放,并且关键是确保在释放数据源数组时将其从数据源数组中移除,以免发生这种情况。但是,所有这些只是一个猜测,因为你没有包含任何代码。如果你真的想要一些帮助,告诉我们你在做什么。 :) – lnafziger 2013-05-23 04:09:46

+0

如果您可以在模拟器上重现问题,请在僵尸工具下运行它。如果您只能在设备上执行此操作,请转至产品>方案>编辑方案...>运行>诊断,然后选中“启用僵尸对象”复选框。 – 2013-05-23 05:21:02

回答

-1

不要在代码中创建的UITableView对象,你就失去了视图之间的链接,如果你创建一个这样的对象也不会帮助你可以这样

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

创造财产这将解决你的问题,我认为。

+0

只要您正确编写并建立正确的连接,在代码中创建对象没有任何问题。 – Abizern 2013-05-23 10:32:51

+1

@Abizem在上面的代码中,他每次创建对象时,他想要执行重新加载,并且他不是将tableview添加到实际视图。然后它如何链接。 – NSLog 2013-05-23 10:48:37

+0

这就是为什么我说你需要正确地写入它第一个地方。 – Abizern 2013-05-23 11:15:52

0

是不是引起你的注意,在第三行UITableView的名称拼写错误?

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

它应该是tableviewObject.datasource = self;

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

0

至于解决一个更通用的方法:

如果您使用ARC你需要保持存到自己的对象或他们将得到释放的您。
在上面的示例中(让我们假设你也指定了tableviewObject.datasource),你需要一些属性或类成员来保存对你的tableviewObject的引用。 E.g:

@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是活的。

通用的是要记住很简单,如果你wan't保持电弧释放的东西总得有人用它(引用或成员属性算作“使用”)。

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

相关问题