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。