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
方法的实现?
您用来加载ProgrammeTableViewCell
的loadFromNibNamed:
方法是什么?如果它只是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的主要内容,如果未能解决你的问题,请参考以下文章