如何在Objective c中使用ARC知道对象是否存在

时间:2013-03-14 04:37:53

标签: iphone uitableview search automatic-ref-counting

您好我的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。

3 个答案:

答案 0 :(得分:0)

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

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

应该是tableviewObject.datasource = self;

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

答案 1 :(得分: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处于活动状态,它就会保持可用状态。

要记住的一般事情就是如果你不想让ARC放弃某人必须使用它的东西(引用或成员属性计为“使用”

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

答案 2 :(得分:-1)

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

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

这会解决你的问题。