EXC_BAD_ACCESS访问委托应用程序上的NSArray

时间:2011-05-26 21:20:27

标签: iphone objective-c delegates nsarray exc-bad-access

我正在开发一个iPhone应用程序,我在访问委托上定义的一个NSArray时遇到问题。

我的应用有两个标签。这两个选项卡有一个UITableView。我在委托中定义的一个NSArray上有这些表的数据源。

当我加载应用程序时,第一个选项卡正确加载所有内容。这是第一个标签控制器代码的一部分:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    // Return the number of rows in the section.
    mainAppDelegate *delegate = [[UIApplication sharedApplication]delegate];
    return [delegate.dataArray count];
}

当调试器在return语句中时,我可以看到dataArray有9个元素。代码工作正常。

当我单击第二个选项卡时,在第二个选项卡控制器中执行相同的代码。但是当调试器在return语句中时,我可以看到委托不是null而dataArray显示

{(int)[$ VAR count]}个对象

下一步,程序崩溃,提供EXC_BAD_ACCESS

我认为在这一点上dataArray已经发布,但我不知道何时发布。我删除了对dealloc函数的dataArray释放调用。

这是dataArray的属性定义:

@property (nonatomic, retain) NSArray *dataArray;

任何人都有任何想法?我完全迷失了。谢谢你的帮助!

2 个答案:

答案 0 :(得分:0)

根据您的评论,您可以像这样初始化数组:

 dataArray = [dict objectForKey:@"data"];

由于您直接访问ivar而不是属性,因此不保留数组。你应该这样做:

self.dataArray = [dict objectForKey:@"data"];

一些程序员喜欢用不同的ivar名称合成他们的属性以避免这样的错误。

@synthesize dataArray = dataArray_;

答案 1 :(得分:0)

在你的评论中你刚才说dataArray是servlet的响应,你用json-framework解析它。

这听起来像你的dataArray对象只存储对传入的外部数组对象的引用。

您还没有发布太多代码。你能说明你的dict对象被初始化了吗?

您的外部对象可能会被释放,导致EXC_BAD_ACCESS