UITableViewCell及其内存中的ViewModel持久性

时间:2016-03-18 19:13:41

标签: ios objective-c uitableview memory-management mvvm

我注意到我的iOS应用程序内存消耗正在增加,而我正在滚动表格视图。使用Allocations工具我发现一些表视图单元格没有被保留,相应的视图模型根本没有保留。可能导致什么呢?内存泄漏仪器没有发现任何问题,我也没有看到任何可以将其保存到内存中的VM的强引用。

这是来自tableView委托/数据源的代码:

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

    id<STReactiveView> cell = [tableView dequeueReusableCellWithIdentifier:_cellId];
    STContact *contact;

    if(!_searchController.active) {
         contact = [[_arrangedData objectForKey:[_sectionTitles objectAtIndex:indexPath.section]] objectAtIndex:indexPath.row];
    }
    else
        contact = [_filteredData objectAtIndex:indexPath.row];

    STContactsListItemViewModel *cellVM = [[STContactsListItemViewModel alloc] initWithContact:contact services:_services];
    [cell bindViewModel:cellVM];

    UITableViewCell *returnCell = (UITableViewCell *)cell;

   return returnCell;
}

从细胞类:

@interface STContactViewCell()

@property (strong, nonatomic) IBOutlet UILabel *nameLabel;
@property (strong, nonatomic) IBOutlet UIButton *phoneButton;
@property (strong, nonatomic) IBOutlet UIButton *messageButton;
@property (strong, nonatomic) IBOutlet UILabel *statusLabel;
@property (strong, nonatomic) IBOutlet UIImageView *photoView;
@property (strong, nonatomic) IBOutlet UIImageView *statusImage;
@property (strong, nonatomic) STContactsListItemViewModel *viewModel;


@end

@implementation STContactViewCell

-(void)bindViewModel:(id)viewModel {

    _viewModel = viewModel;
    [self initialize];
}

-(void)initialize {
    self.nameLabel.text = _viewModel.contact.name;
    self.statusLabel.text = _viewModel.contact.statusText;
    self.photoView.contentMode = UIViewContentModeScaleToFill;

    if(_viewModel.contact.photo)
        [self.photoView setImage:_viewModel.contact.photo];
    else {
        if(_viewModel.contact.url.length)
            [self.photoView sd_setImageWithURL:[NSURL URLWithString:_viewModel.contact.url]];
        else
            [self.photoView setImage:[UIImage imageNamed:@"ContactPlaceholder"]];
    }


    [_statusImage setImage:[UIImage imageNamed:[NSString stringWithFormat:@"Status%@",_viewModel.contact.status]]];
    [_phoneButton setImage:[UIImage imageNamed:[NSString stringWithFormat:@"Phone%@",_viewModel.contact.status]]forState:UIControlStateNormal];
    [_phoneButton setImage:[UIImage imageNamed:[NSString stringWithFormat:@"Phone%@Dim",_viewModel.contact.status]]forState:UIControlStateHighlighted];
    [_messageButton setImage:[UIImage imageNamed:[NSString stringWithFormat:@"Message%@",_viewModel.contact.status]]forState:UIControlStateNormal];
    [_messageButton setImage:[UIImage imageNamed:[NSString stringWithFormat:@"Message%@Dim",_viewModel.contact.status]]forState:UIControlStateHighlighted];
    _photoView.layer.cornerRadius = _photoView.frame.size.width/2;
    _photoView.layer.masksToBounds = YES;
    [_photoView setContentMode:UIViewContentModeScaleAspectFill];

    _phoneButton.rac_command = _viewModel.executePhoneCall;
    _messageButton.rac_command = _viewModel.executeMessageSend;

    if([_viewModel.contact.status isEqualToString:@"Unavailable"]) {
        [_phoneButton setEnabled:NO];
        [_messageButton setEnabled:NO];
    }

}

最后但并非最不重要的是,分配截图: allocations

0 个答案:

没有答案