我的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];
现在它可以正常工作了,但是,如果我尝试回忆相同的代码(只需按行,更改视图,再回来再按行),应用程序就会没有日志而且会显示相同的消息。
有什么建议吗?
感谢, 安德烈
答案 0 :(得分:1)
您似乎过度释放mgdb
对象。
如果您没有从名称以alloc
,new
开头的方法中获取对象,并且如果您没有向其发送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的转换,这不是必要的,但是很好的做法。
再见, 安德烈