【问题标题】:UITableView dequeueReusableCellWithIdentifier possible leak while Scrolling滚动时 UITableView dequeueReusableCellWithIdentifier 可能泄漏
【发布时间】:2014-09-12 16:19:51
【问题描述】:

每次向上和向下滚动 UITableView 时,内存使用量都会增加。我使用 dequeueReusableCellWithIdentifier,但它似乎并没有优化内存使用。代码如下:

我以为是因为每次都分配了 UIImageView,但是当我注释这些代码行并只留下标准 UITableViewCell 实现时,内存问题并没有消失。虽然在离开视图内存后释放(obv 它发生仅归功于 [self.tableView removeFromSuperview]; 方法)。但是当我留在视图中并继续上下滚动时,内存只会增加。

@interface ArtistsViewController ()

@property (weak, nonatomic) IBOutlet UITableView *tableView;

@end

@implementation ArtistsViewController

@synthesize fetchedResultsController = _fetchedResultsController;

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSError *error;
    if (![[self fetchedResultsController] performFetch:&error]) {
        // Update to handle the error appropriately.
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        exit(-1);  // Fail
    }
    self.tableView.delegate = self;
    self.tableView.dataSource = self;

    self.tableView.backgroundColor = [UIColor colorWithRed:11/255.0 green:12/255.0 blue:20/255.0 alpha:1.0];
    self.tableView.opaque = NO;
    self.tableView.backgroundView = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:YES];
    [self.tableView removeFromSuperview];
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    id  sectionInfo =
    [[_fetchedResultsController sections] objectAtIndex:section];
    return [sectionInfo numberOfObjects];
}

- (void)loadCellData:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {
    Artist *artist = [_fetchedResultsController objectAtIndexPath:indexPath];
    NSLog(@"%@", artist.name);
    cell.textLabel.text = [NSString stringWithFormat:@"%@", artist.name];
    cell.detailTextLabel.text = [NSString stringWithFormat:@"%lu songs", (unsigned long)[artist.songs count]];

    NSString *fileName = [NSString stringWithFormat: @"%@/%@.png", [[NSBundle mainBundle] resourcePath], artist.name];

    UIImageView *imgView = [[UIImageView alloc]initWithFrame:CGRectMake(20, 2, 55, 55)];

    imgView.image=[UIImage imageWithContentsOfFile:fileName];
    [cell.contentView addSubview:imgView];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (!cell) {
        NSLog(@"NOCELL");
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    }

    //Load cell data
    [self loadCellData:cell atIndexPath:indexPath];

    //customization
    cell.contentView.backgroundColor = cell.selectedBackgroundView.backgroundColor = [UIColor colorWithRed:11/255.0 green:12/255.0 blue:20/255.0 alpha:1.0];
    cell.textLabel.textColor = [UIColor colorWithWhite:222/255.0 alpha:1.0];
    cell.detailTextLabel.textColor = [UIColor colorWithRed:62/255.0 green:103/255.0 blue:115/255.0 alpha:1.0];

    return cell;
}

#pragma mark - fetchedResultsController

- (NSFetchedResultsController *)fetchedResultsController {

    if (_fetchedResultsController != nil) {
        return _fetchedResultsController;
    }

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription
                                   entityForName:@"Artist" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];

    NSSortDescriptor *sort = [[NSSortDescriptor alloc]
                              initWithKey:@"name" ascending:YES];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];


    NSFetchedResultsController *theFetchedResultsController =
    [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                        managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil
                                                   cacheName:@"Root"];
    self.fetchedResultsController = theFetchedResultsController;
    _fetchedResultsController.delegate = self;

    return _fetchedResultsController;

}

【问题讨论】:

    标签: ios uitableview memory-leaks scroll


    【解决方案1】:

    添加自定义单元格而不是使用默认单元格属性。

    static NSString *MyIdentifier = @"MyIdentifier";
            MyCustomCell *cell = (MyCustomCell *)[tableView dequeueReusableCellWithIdentifier: MyIdentifier];
            if (cell == nil) {
                NSArray *nib;
    
                    nib = [[NSBundle mainBundle] loadNibNamed:@"MyCustomCell"
                                                        owner:self options:nil];
    
    
                for (id oneObject in nib) if ([oneObject isKindOfClass:[MyCustomCell class]])
                    cell = (YorBillTableCell *)oneObject;
    

    【讨论】:

    • 没有帮助。还在漏。似乎是自 2009 年以来的一次泄漏。
    猜你喜欢
    • 1970-01-01
    • 2018-09-27
    • 2012-04-29
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    相关资源
    最近更新 更多