TableViewController - 从数据库中检索数据

时间:2010-07-13 10:51:43

标签: objective-c uitableview

我的TableController出了问题。

当我调用cellForRowAtIndexPath()时,我能够从Database类中检索信息:

myGroupsAppDelegate *appDelegate = (myGroupsAppDelegate *)[[UIApplication sharedApplication] delegate]; 
myGroupsDB *mgdb = [ appDelegate.groups_db objectAtIndex:indexPath.row ];   
cell.textLabel.text = mgdb.group_name;
[mgdb release];

但如果我尝试从didSelectRowAtIndexPath()调用相同的内容,则会出错。我需要将两个值传递给视图,我正在使用此代码:

SingleGroupView *sgv = [[SingleGroupView alloc] initWithNibName:@"SingleGroupView" bundle:[NSBundle mainBundle]];

myGroupsAppDelegate *appDelegate = (myGroupsAppDelegate *)[[UIApplication sharedApplication] delegate];
myGroupsDB *mgdb = [ appDelegate.groups_db objectAtIndex:indexPath.row ];

sgv.groupID = mgdb.id_group;
sgv.groupName = mgdb.group_name;

[mgdb release];

当我尝试将mgdb.id_group分配给sgv.groupID时,我得到一个EXC_BAD_ACCESS。似乎mgdb是空的。

--------------更改------------------

在构建和分析之后,编译器显示“此时不是所有者的对象的引用计数的Incorect减量”。但是,我在这里创造,不是本地的吗?所以我添加了一个保留:

myGroupsDB *mgdb = [[ appDelegate.groups_db objectAtIndex:indexPath.row ] retain];

现在它可以正常工作了,但是,如果我尝试回忆相同的代码(只需按行,更改视图,再回来再按行),应用程序就会没有日志而且会显示相同的消息。

有什么建议吗?

感谢, 安德烈

2 个答案:

答案 0 :(得分:1)

您似乎过度释放mgdb对象。

如果您没有从名称以allocnew开头的方法中获取对象,并且如果您没有向其发送retain消息,那么这意味着你没有“拥有”这个对象,你不应该release它。

您可以在Memory Management Programming Guide中阅读更多内容。

注意:当你得到EXC_BAD_ACCESS时,这意味着你正在访问一个你不被允许访问的内存区域(在这种情况下你不能访问它,因为它可能已被解除分配)。 / p>

答案 1 :(得分:0)

我找到了(我?你)解决方案。

cellForRowAtIndexPath()是:

myGroupsAppDelegate *appDelegate = (myGroupsAppDelegate *)[[UIApplication sharedApplication] delegate];
myGroupsDB *mgdb = (myGroupsDB*)[ appDelegate.groups_db objectAtIndex:indexPath.row ];

cell.textLabel.text = mgdb.group_name;

和didSelectRowAtIndexPath()是:

myGroupsAppDelegate *appDelegate = (myGroupsAppDelegate *)[[UIApplication sharedApplication] delegate];
myGroupsDB *mgdb = (myGroupsDB *)[appDelegate.groups_db objectAtIndex:indexPath.row];

我删除了[release],因为,如“内存管理编程指南”中所述,我不拥有mgdb实例,所以我不负责重新拥有所有权。所以,我不知道为什么用alloc或newObject在内存上创建一个新实例并不是强制性的,但是,如果我不是所有者,我就不会释放该对象。我还添加了mgdb的转换,这不是必要的,但是很好的做法。

再见, 安德烈