VM:UITableViewLabel 占用内存 iOS

Posted

技术标签:

【中文标题】VM:UITableViewLabel 占用内存 iOS【英文标题】:VM: UITableViewLabel eating up memory iOS 【发布时间】:2015-12-21 13:41:47 【问题描述】:

当我滚动 UITableView 时,内存不断增加,当我运行“Allocations”时,我得到了这种结果。

我看到他们的 VM:UITableViewLabel 内存不断增加并且是持久的,他们有什么办法可以消除这种不断增加的内存

-(UITableViewCell*) tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath

    
        NSString *text = @"";
        BOOL defaultStyle = YES;


    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *defaultCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (defaultCell == nil) 
        defaultCell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    
    else
        NSLog(@"reusing the cell");
    

    defaultCell.textLabel.textAlignment = NSTextAlignmentLeft;
    defaultCell.userInteractionEnabled = YES;
    defaultCell.textLabel.font = [UIFont systemFontOfSize:26.0f];

    UIImageView *iv = defaultCell.imageView;


    int totalSections = [self numberOfSectionsInTableView:tableView];
    NSInteger computedSection = indexPath.section;

    if (defaultStyle)
    
        defaultCell.selectionStyle = UITableViewCellSelectionStyleBlue;
        defaultCell.backgroundColor = [UIColor whiteColor];
        defaultCell.textLabel.textColor = [UIColor blackColor];
    

    else if (computedSection == 0)
    
        const int totalRows  = [self tableView:self.tableView numberOfRowsInSection:indexPath.section];
        if (indexPath.row == 0) 
            text = @"Style1";
            defaultStyle = NO;
            if (self.style1 == nil)
            
                defaultCell.selectionStyle = UITableViewCellSelectionStyleNone;
                defaultCell.textLabel.textColor = [UIColor grayColor];
            
            else
            
                defaultCell.selectionStyle = UITableViewCellSelectionStyleBlue;
                defaultCell.textLabel.textColor = [UIColor blackColor];
            
            iv.image = [UIImage imageNamed: @"Style1.png"];

        

        if(indexPath.row == totalRows - 2)
            // Categories
            text = @"Style2";
            iv.image = [UIImage imageNamed: @"Style2.png"];
            defaultStyle = NO;

            if ( self.style2 == nil) 
                defaultCell.selectionStyle = UITableViewCellSelectionStyleNone;
                defaultCell.textLabel.textColor = [UIColor grayColor];
             else 
                defaultCell.selectionStyle = UITableViewCellSelectionStyleBlue;
                defaultCell.textLabel.textColor = [UIColor blackColor];
            
        
        else if (indexPath.row == totalRows - 1)
            // Search
            text = @"Style3";
            iv.image = [UIImage imageNamed: @"Style3.png"];
        

    
    else if (computedSection == 1)
    

        MyCustomTableViewCell *cell = [mTableView dequeueReusableCellWithIdentifier:kCustomTableCellIdentifier];

        if ( cell == nil ) 
            cell = [CustomTableViewCell loadFromNibNamed:@"CustomTableViewCell"];
        
        cell.titleLabel = @"custom cell";
        cell.openImage =[UIImage imageNamed: @"custom.png"]
        return cell;

    
    else if (indexPath.section == totalSections - 1)
    

        if (indexPath.row == 0)
        
            text = @"Account";
            defaultStyle = NO;
            if (self.hasAccount == nil)
            
                defaultCell.selectionStyle = UITableViewCellSelectionStyleNone;
                defaultCell.textLabel.textColor = [UIColor grayColor];
            
            else
            
                defaultCell.selectionStyle = UITableViewCellSelectionStyleBlue;
                defaultCell.textLabel.textColor = [UIColor whiteColor];

            

            iv.image = [UIImage imageNamed: @"Account.png"];
        
    

    defaultCell.textLabel.text = text;
    return defaultCell;

【问题讨论】:

能否也显示ProgrammeTableViewCell 类的标头及其dealloc 方法的实现? 您用来加载ProgrammeTableViewCellloadFromNibNamed: 方法是什么?如果它只是loadNibNamed:owner:options: 的通用包装器,它可能是为 ARC 环境编写的,而您使用的是非 ARC,因此您可以轻松地在其中搞乱自动释放。还有registerNib:forCellReuseIdentifier:dequeueReusableCellWithIdentifier:forIndexPath:,如果需要,它们会自动从NIB 创建单元格,并消除if (cell == nil) 检查的负担。嘿,为什么根本不是 ARC? 【参考方案1】:

我已将您的代码复制到一个新项目中,并进行了一些测试。它从来没有在真实设备上使用过超过 10 Mb 的内存,所以可能有 2 种情况。

    调用泄漏的方法。此时你只调用了 cellForRow 中的一个方法,因为:BOOL defaultStyle = YES; 这个方法是: int totalSections = [self numberOfSectionsInTableView:tableView]; 你能把这个方法也发一下吗?

    UITableViewCell 子类在重用时泄漏。现在这不是一个选项,因为您使用的是 UITableViewCell。

小提示 #1:如果项目在 ARC 中,请删除自动释放。

小注#2:使用

static NSString *CellIdentifier = @"Cell"; UITableViewCell *defaultCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 而不是:

static NSString *CellIdentifier = @"Cell";
UITableViewCell *defaultCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (defaultCell == nil) 
    defaultCell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

else
    NSLog(@"reusing the cell");

而且您无需手动检查和分配新单元。

【讨论】:

【参考方案2】:

感谢大家的帮助,以下解决方案对我有用

1.

-(void) viewDidLoad 

    [super viewDidLoad];

    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:kDefaultCellIdentifier];
    [self.tableView registerNib:[UINib nibWithNibName:@"CustomTableViewCell" bundle:nil] forCellReuseIdentifier:kCustomTableCellIdentifier];

@Péter Kovács 告诉我们

2.

两个单元格都使用 indexPath 方法

static NSString *CellIdentifier = kDefaultCellIdentifier;
    UITableViewCell *defaultCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

static NSString *CellIdentifier = kCustomTableViewCellIdentifer;
    UITableViewCell *defaultCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

3。

主要问题我在 globally 中使用 defaultCell,它还为 CustomTableViewCell 将 defaultCell 出列,因此在触发 CustomTableViewCell 块的情况下,它会出列两个单元格。根据单元格的行出列各个单元格解决了这个问题。

【讨论】:

如果你接受我的回答就不那么优雅了,然后你根据我的回答发表解决方案评论,并接受你自己的回答而不是我的回答。 :D Ofc,没问题,我很高兴能帮上忙。 :) 好的接受了你的答案,因为你的答案没有回答我的确切问题,请参阅我的问题的第三点【参考方案3】:

我认为您没有重复使用表格视图中使用的单元格

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"myCell"];
if (cell == nil) 

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"myCell"];
 else 
    // reset your cell values here

在你的-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath中使用这个

【讨论】:

我已经在使用它了,我可以在日志中看到它正在重用单元格 布尔变量 defaultStyle 在达到 if 条件时始终为 YES。所以它总是满足 if 条件。您能否检查一下这是否导致任何问题?

以上是关于VM:UITableViewLabel 占用内存 iOS的主要内容,如果未能解决你的问题,请参考以下文章

centos系统内存 buff/cache 占用过高

pre cache 占用高 jvm

charles占用cpu内存

buff占用内存高

如何查看mysql内存占用原因

idea吃了16g40%内存