Objective c UITableView内存问题
我正在我的Objective c UITableView内存问题,objective-c,xcode,uitableview,uiview,Objective C,Xcode,Uitableview,Uiview,我正在我的UITableView的一些单元格中添加UIView。我使用了dequeueReusableCellWithIdentifier,似乎当我上下滚动时,视图从未从内存中删除,它会在已经加载的视图之前不断添加新视图。它会永远增加记忆,这不是它应该的方式 如何在未显示时从内存中删除这些ui视图 else if (indexPath.row == 0 && !isPremium) { // Google AdMob adCell = [table
UITableView
的一些单元格中添加UIView
。我使用了dequeueReusableCellWithIdentifier
,似乎当我上下滚动时,视图从未从内存中删除,它会在已经加载的视图之前不断添加新视图。它会永远增加记忆,这不是它应该的方式
如何在未显示时从内存中删除这些ui视图
else if (indexPath.row == 0 && !isPremium) {
// Google AdMob
adCell = [tableView dequeueReusableCellWithIdentifier:adCellId];
if (adCell == nil) {
adCell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:adCellId];
}
AdMobView = [[GADBannerView alloc]initWithAdSize:kGADAdSizeSmartBannerPortrait];
AdMobView.adUnitID = @"ca-app-pub-XXXXXXXXXXXXXXX";
AdMobView.rootViewController = self;
AdMobView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
// load the ads
GADRequest *request = [GADRequest request];
request.testDevices = [NSArray arrayWithObjects:GAD_SIMULATOR_ID, @"XXXXXXXXX", nil]; // COMMENT THIS LINE WHEN IN PROD
// add gps
if ([latitude length] > 2 && [longitude length] > 2) {
[request setLocationWithLatitude:[latitude floatValue] longitude:[longitude floatValue] accuracy:50]; // accuracy [m]
}
adCell.backgroundColor = [UIColor colorWithRed:247.0/255.0 green:149.0/255.0 blue: 24.0/255.0 alpha:1];
if (!AdMobView.superview) {
[AdMobView loadRequest:request];
}
AdMobView.tag = 3000;
[adCell.contentView addSubview:AdMobView];
[adCell setSelectionStyle:UITableViewCellSelectionStyleNone];
return adCell;
}
如果单元格被重用,但视图仍在堆积,这可能是因为在
cellForRowAtIndexPath:
中,您甚至将视图添加到已具有该视图的回收单元格中。因此,当您上下滚动时,视图的数量不断增加,在每个单元格中彼此重叠
因此(现在您已经添加了一些代码),您会说:
[adCell.contentView addSubview:AdMobView];
…对于每个细胞,无条件地。但是如果一个单元格被重用,它已经有了一个AdMobView!您需要对此进行检查,以便仅有条件地添加此子视图(对于您添加的任何其他子视图也是如此)。没有代码就无法诊断,您可以添加代码吗?问题很好。你有什么证据?你如何证明这些电池没有被重复使用?如果你是对的,那可能是因为你的
标识符:
与单元格标识符不匹配。顺便说一句,下面是一些示例代码,告诉你如何跟踪单元格是否被重用:我添加了一个alpha=0.2的UIImageView
。当我上下滚动时,它变暗了,这意味着它在前一张图像的前面再次添加了一张新图像。确实很好:您已经检测到了问题,并且很好地解释了问题。查看下面的答案。例如,查看我的代码:我使用标记添加的子视图,以确保不会再次添加它,并且如果它已经存在于重用的单元格中,则以不同的方式对其进行配置。在这里进一步查看我的讨论:我添加了以下内容:if(adCell.contentView.tag!=3000){[adCell.contentView addSubview:AdMobView];adCell.contentView.tag=3000;}
这就解决了问题。@matt的回答很好。这很聪明,没有法律规定你不能通过给内容视图一个标签来标记单元格。但这太不灵活了。我建议你更仔细地模仿我在我指给你的代码中所做的事情-将标签添加到AdMobView,并询问内容视图是否有带有该标签的子视图ag。