Ios UIlabel使用大量内存和大量文本
我有UITable视图,在UITable单元格中,我使用自己的标签和非常非常长的文本。结果,这个uilabel花费了大约100 mb。(在这种情况下-内存警告,然后崩溃)。我怎样才能修好它?提前谢谢Ios UIlabel使用大量内存和大量文本,ios,uitableview,uilabel,Ios,Uitableview,Uilabel,我有UITable视图,在UITable单元格中,我使用自己的标签和非常非常长的文本。结果,这个uilabel花费了大约100 mb。(在这种情况下-内存警告,然后崩溃)。我怎样才能修好它?提前谢谢 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UILabel *message; CGSize textSize;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UILabel *message;
CGSize textSize;
CGSize fullSize = CGSizeMake(300, 100000);
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
message = [[UILabel alloc] init];
message.frame = CGRectMake(10, 30, 100, 20);
message.font = [UIFont systemFontOfSize:12.0f];
message.textAlignment = UITextAlignmentLeft;
message.textColor = [UIColor whiteColor];
message.tag = 103;
message.numberOfLines = 100000;
message.backgroundColor = [UIColor clearColor];
[cell.contentView addSubview:message];
[message release];
}
else
{
message = (UILabel *)[cell.contentView viewWithTag:103];
}
NSData *messageData = [[grandData objectAtIndex:indexPath.row] objectForKey:@"content"];
NSString *tempContent = [[NSString alloc] initWithData:messageData encoding:NSUTF8StringEncoding];
message.text = tempContent; // text about 10000 symbols in length
[tempContent release];
textSize = [message.text sizeWithFont:[UIFont systemFontOfSize:12] constrainedToSize:fullSize lineBreakMode:UILineBreakModeWordWrap];
message.frame = CGRectMake(10, 30, textSize.width, textSize.height + 6);
return cell;
}
我使用消息标签(不是cell.textLabel),因为有些标签显示其他信息(我剪切了多余的代码)。单元格高度会根据单元格中的文本量动态变化
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
你正在泄漏内存 创建时:
NSString *tempContent = [[NSString alloc] initWithData:messageData encoding:NSUTF8StringEncoding];
之后您不会发布tempContent
您应该将代码更改为以下内容:
NSData *messageData = [[grandData objectAtIndex:indexPath.row]
objectForKey:@"content"];
NSString *tempContent = [[NSString alloc] initWithData:messageData
encoding:NSUTF8StringEncoding];
message.text = tempContent; // text about 10000 symbols in length
[tempContent release];
你正在泄漏内存 创建时:
NSString *tempContent = [[NSString alloc] initWithData:messageData encoding:NSUTF8StringEncoding];
之后您不会发布tempContent
您应该将代码更改为以下内容:
NSData *messageData = [[grandData objectAtIndex:indexPath.row]
objectForKey:@"content"];
NSString *tempContent = [[NSString alloc] initWithData:messageData
encoding:NSUTF8StringEncoding];
message.text = tempContent; // text about 10000 symbols in length
[tempContent release];
我对Swift 3也有同样的问题 尽管我使用了dequeueReusableCell
class StepTableViewCell: UITableViewCell {
@IBOutlet weak var stepImageView: UIImageView!
@IBOutlet weak var stepNumberLabel: UILabel!
@IBOutlet weak var contentLabel: UILabel!
}
var fontSize = CGFloat(14)
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
customCell = tableView.dequeueReusableCell(withIdentifier: "StepCellWithoutImage", for: indexPath) as! StepTableViewCell
customCell.stepNumberLabel.text = "\(cellInfo.index + 1)"
customCell.contentLabel.font = UIFont.systemFont(ofSize: fontSize)
customCell.contentLabel.text = step.content
debugPrint(step.content?.count)
return customCell
}
问题是当它试图增加字体并重新加载tableView时,我对Swift 3也有同样的问题 尽管我使用了dequeueReusableCell
class StepTableViewCell: UITableViewCell {
@IBOutlet weak var stepImageView: UIImageView!
@IBOutlet weak var stepNumberLabel: UILabel!
@IBOutlet weak var contentLabel: UILabel!
}
var fontSize = CGFloat(14)
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
customCell = tableView.dequeueReusableCell(withIdentifier: "StepCellWithoutImage", for: indexPath) as! StepTableViewCell
customCell.stepNumberLabel.text = "\(cellInfo.index + 1)"
customCell.contentLabel.font = UIFont.systemFont(ofSize: fontSize)
customCell.contentLabel.text = step.content
debugPrint(step.content?.count)
return customCell
}
问题是,当它尝试增加字体并重新加载tableView时,实际使用的文本大小是多少?您是否尝试过将文本放在不同的标签上?单元格是否可以重复使用?重复使用单元格而不是标签,虽然单元格在视图中可见-标签在内存中分配取决于文本的大小,但可能并非所有文本都可见。如果将文本分为不同的标签,每个标签分为不同的单元格,则可以避免将所有这些标签都放在内存中。要放入内存的文本大小是多少?代码段中设置的文本大小。这不仅仅是动态更改文本、单元格的后梯度以及在一个单元格中分配的更多其他标签在几个单元格上分割。您使用的文本大小是多少?您是否尝试过将文本放在不同的标签上?单元格是否可以重复使用?重复使用单元格而不是标签,虽然单元格在视图中可见-标签在内存中分配取决于文本的大小,但可能并非所有文本都可见。如果将文本分为不同的标签,每个标签分为不同的单元格,则可以避免将所有这些标签都放在内存中。要放入内存的文本大小是多少?代码段中设置的文本大小。这不仅仅是动态更改文本、单元格的后梯度和更多其他标签,这些标签分配在一个单元格中,并在几个单元格上进行分割。这不起作用。我使用release,当我复制代码时意外地剪切了这段代码。现在修好它。当这个单元格从屏幕内存中消失时,这不起作用。我使用release,当我复制代码时意外地剪切了这段代码。现在修好它。当此单元格从屏幕内存中消失时返回