gpt4 book ai didi

ios - 为什么我在调用 UICollectionViewCell dequeueReusableCellWithReuseIdentifier 时会收到释放的内存调用?

转载 作者:行者123 更新时间:2023-11-29 11:03:33 25 4
gpt4 key购买 nike

我有一个包含自定义 UICollectionViewCell 的 UICollectionView(TestReceiptCell 是类名)。

当自定义单元格仅包含 UILabel 时,让 UICollectionView 出现并加载自定义单元格没有任何问题。

然后我通过 IB 添加了一个 UITableView 到 TestReceiptCell NIB 文件中。我在 TestReceiptCell.h 中为 UITableView 设置了一个引用 socket ,并在 .m 文件中进行了合成。我将 UITableView 的委托(delegate)和数据源设置为包含 UICollectionView 的 ViewController。

现在,当运行该应用程序时,我在第三行的此 block 中收到 EXC_ BAD_ ACCESS 异常:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
static NSString *cellIdentifier = @"TestReceiptCell";
TestReceiptCell *cell = (TestReceiptCell *)[collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath]; //exception thrown here
return cell;
}

我运行了 Zombie Instrument 测试,发现释放的内存调用源自此处。这是我第一次使用该仪器,所以我不确定如何从这里进行调查。

作为引用,这里有一些更相关的代码部分:

ViewController.m

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
[self.myCollectionView registerNib:[UINib nibWithNibName:@"TestReceiptCell" bundle:nil] forCellWithReuseIdentifier:@"TestReceiptCell"];

// Setup flowlayout
myCollectionViewFlowLayout = [[UICollectionViewFlowLayout alloc] init];
[myCollectionViewFlowLayout setItemSize:CGSizeMake(310, 410)];
[myCollectionViewFlowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];
[self.myCollectionView setCollectionViewLayout:myCollectionViewFlowLayout];
self.myCollectionView.pagingEnabled = YES;
}

我也在 ViewController.m 文件中实现了 UITableView 数据源和委托(delegate)方法,但鉴于 EXC_BAD_ACCESS 异常的起源,我不确定问题是否出在这里:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return 1;
}

- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = nil;
cell = [tableView dequeueReusableCellWithIdentifier:@"eventCell"];

if(!cell){
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"eventCell"];
}
return cell;
}

更新:

如果我将 cellForItemAtIndexPath 更改为:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
static NSString *cellIdentifier = @"TestReceiptCell";
//TestReceiptCell *cell = (TestReceiptCell *)[collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
TestReceiptCell *cell = [NSBundle.mainBundle loadNibNamed:@"TestReceiptCell" owner:self options:nil][0];
return cell;
}

但是,我并没有让单元格出队,而且我知道这不是正确的方法。 dequeueReusableCellWithResueIdentifier 创建新单元格时调用的 initWithFrame 方法中某处似乎存在问题。这是当前的方法:

- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:@"TestReceiptCell" owner:self options:nil];
if ([arrayOfViews count] < 1) {
return nil;
}
if (![[arrayOfViews objectAtIndex:0] isKindOfClass:[UICollectionViewCell class]]) {
return nil;
}
self = [arrayOfViews objectAtIndex:0];
}
return self;
}

编辑:

如果我没有为 TableView 选择委托(delegate)或数据源,将加载带有 TableView 的 Collection View 。将委托(delegate)/数据源附加到文件所有者的某些内容导致了错误。

最佳答案

当您注册一个 UINib 以进行单元重用时,dequeueReusableCellWithReuseIdentifier:forIndexPath: 就是在您注册的 UINib 上调用 instantiateWithOwner:options: 的。无论它传递给所有者的是什么,都会成为您 Nib 中的文件所有者导出。

您似乎希望文件所有者是 UICollectionView,但我认为不是。

即使是这样,我也不认为您应该将 UICollectionView 用作每个集合单元格中包含的 UITableView 的委托(delegate)。这将需要您的 UICollectionView 跟踪每个单元格中的 tableView 和内容。

我建议将包含的 tableView 的委托(delegate)设置为集合单元格本身,并让每个单元格管理自己的 tableview。

编辑:

您可以为 Collection View 单元格定义委托(delegate)协议(protocol),以将相关的 TableView 事件传递给 Collection View 。使用这种方法,您可以在 Collection View 数据源的 collectionView:cellForItemAtIndexPath 方法中设置为每个集合单元格定义的委托(delegate)属性。

例如,当用户从表中选择一个项目时,您可以调用单元格委托(delegate)来通知 Collection View 选择了哪个项目。

这种方法允许您抽象出您的集合单元格正在使用表格 View 来显示单元格信息的事实。稍后,如果您决定要使用(例如)嵌入式 UICollectionView 来显示这些项目,委托(delegate)协议(protocol)可以保持不变,您可以隔离对集合单元的更改。

关于ios - 为什么我在调用 UICollectionViewCell dequeueReusableCellWithReuseIdentifier 时会收到释放的内存调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14720243/

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