4

嗨,在我的 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。

4

3 回答 3

0

您是否注意到第三行中 UITableView 的名称拼写错误?

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

应该是 tableviewObject.datasource=self;

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

于 2013-05-23T10:29:01.180 回答
0

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

如果您使用 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,它基本上具有相同的结果。

于 2013-05-23T12:04:47.743 回答
-1

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

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

我认为这将解决您的问题。

于 2013-05-23T09:57:16.950 回答