UITableView内存问题

时间:2014-05-30 17:26:47

标签: objective-c xcode uitableview uiview

我在UIView的某些单元格中添加了UITableView。我使用dequeueReusableCellWithIdentifier似乎当我上下左右上下滚动时,视图永远不会从内存中删除,并且它会在已加载的视图前面添加新视图。它会永远增加内存,而不是应该的样子。

如何在不显示时从内存中删除这些UIViews

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;
}

1 个答案:

答案 0 :(得分:2)

如果正在重复使用单元格,但视图仍在堆积,那就是因为在cellForRowAtIndexPath:中,您正在将视图添加到已经拥有该视图的已回收单元格。因此,当您向上和向下滚动时,视图的数量不断增加,在每个单元格中彼此叠加。

因此(现在您已经添加了一些代码),您说:

[adCell.contentView addSubview:AdMobView];

... 每个单元格,无条件。但如果一个单元格被重用,它已经有了一个AdMobView!您需要检查这一点,以便仅有条件地添加此子视图(对于您添加的任何其他子视图也是如此)。