gpt4 book ai didi

objective-c - 当TableView的DataSource数组改变时,App崩溃

转载 作者:行者123 更新时间:2023-12-03 16:26:35 24 4
gpt4 key购买 nike

我有一个包含 5 个项目的数组,也用作表格 View 的内容。 Nib 中有一个按钮,可将数组的内容更改为 5 个不同的项目。然而,当我单击该按钮时,应用程序崩溃并显示 EXC_BAD_ACCESS。我在 objc_exception _throw 上设置了一个断点,并证实了我的怀疑。不好的方法是

- (id)tableView:(NSTableView *)wordsTableView
objectValueForTableColumn:(NSTableColumn *)column
row:(int)rowIndex
{
return [[currentCard words] objectAtIndex:rowIndex];
}

currentCard 是 GameCard 类的一个实例,其数组 Words 就是所讨论的数组。第一次启动时,它工作正常,但如果我尝试更改它,就会崩溃。

----------编辑----------

在AppController的awakeFromNib中:我有这个

currentCard = [[GameCard alloc] init];

在按钮的 IBAction 中,我有这个:

[currentCard release];
currentCard = [[GameCard alloc] init];

启用僵尸后,当我单击按钮时,我会从 GDB 获取此信息:

2009-06-22 18:55:03.368 25WordsMax[19761:813] *** -[CFArray objectAtIndex:]:发送到已释放实例 0x14ba00 的消息

引用数据源方法。我几个小时以来一直在尝试追踪内存错误,但我没有找到它。

我非常沮丧,我注释掉了代码中的每个保留和释放(无自动释放),但仍然得到 2009-06-22 19:41:58.564 25WordsMax[21765:813] *** -[CFArray objectAtIndex:]:当我点击按钮时,消息发送到已释放的实例 0x14c330。

什么是调用数据源方法?我没有调用 reloadData。如果在我的数据源方法中,我为每一行返回@“A Word”,则一切运行正常。在 GDB 中,我什至可以看到 NSLogs 打印新数组的内容,一切顺利。只有当问题中看到的数据源方法被调用时才会发生任何问题。

最佳答案

2009-06-22 18:55:03.368 25WordsMax[19761:813] *** -[CFArray objectAtIndex:]: message sent to deallocated instance 0x14ba00

请仔细阅读。接收者是 CFArray 的一个实例,消息选择器是 objectAtIndex:

释放的实例是一个数组,而不是游戏卡。

你的游戏卡拥有该数组,因此它必须以某种方式保留它。这意味着您必须:

  1. 使用 alloc 和 init 创建数组(而不是自动释放它)。
  2. 保留它。
  3. 制作自己的副本。 (如果您从另一个对象接收数组(如在您的 setter 中),则最好,因为您收到的数组可能是可变的,并且您不希望其他对象改变“您的”数组。)

如果您综合访问器,请将属性声明为 @property(retain)@property(copy)。请注意,如果您想要一个可变副本,这将不起作用;在这种情况下,您必须自己实现 setter。

关于objective-c - 当TableView的DataSource数组改变时,App崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1029475/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com