【问题标题】:UITextView: Huge Memory UsageUITextView:巨大的内存使用
【发布时间】:2019-06-11 18:58:18
【问题描述】:

我在 UITextView 中遇到了似乎过多的内存使用情况。我正在将一个 50Kb 的 ascii 文本文件加载到 NSString 中,并将其分配给我的应用程序中空 UITextView 组件的 .text 属性。这立即为我的内存占用增加了 100Mb 以上(实际文本内容的 2000 倍)。

有没有办法(属性或转换)使 UITextView 更节省内存?我需要内容的可编辑性和滚动性,但它是纯文本(未归因),我没有使用任何复杂的布局或富文本功能。

对于上下文:我在内存受限的环境(音频单元扩展)中工作,因此每 Mb 内存都很重要。

这似乎与有据可查的 iOS11 UITextView 内存泄漏无关,因为我没有释放该组件。

NSError* error = nil;
NSString* path = [[NSBundle mainBundle] pathForResource:@"Example" ofType:@"txt"];
NSString* content = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];
myUITextView.text = content; // this adds over 110Mb of memory usage for a 50Kb text file.

【问题讨论】:

  • 我使用包含随机文本的190KB 文件对IOS 12 进行了测试,但我没有超过50MB 标记。你确定+[NSStringWithContentsOfFile:encoding:error] 没有被多次调用吗?此外,目前尚不清楚您使用的是哪个版本 - 您使用的是 iOS 11 还是 12?
  • 文本加载不是问题:在调试器中,我可以看到内存需求不会增长,直到将 NSString 分配给 UITextView。我也可以用相同的结果“生成”字符串(而不是加载它)。这是在 iOS12 上。
  • 这个十年前的 iOS 问题在某些情况下似乎仍然存在!

标签: ios objective-c uikit


【解决方案1】:

OP 完全正确!

我们发现,如果您添加到文本视图中,在“+=”意义上,它会使用大量内存。

我们有一个这样的文本视图

 @IBOutlet var showValues: UITextView!

它会显示一些文本行(例如,10 到 100 行左右),每行只是一个整数。

所以我每次都非常简单地“附加”文本,如下所示:

 latestValue: String = .. // something like "14.4 \n"
 showValues.text += latestValue

如果您只是尝试这样做,它会每行增加大约 1/2 mb !!!!!!!!!

也许这是 iOS 中的一个普通错误?

怎么可能?这很容易测试!

【讨论】:

  • 确实,问题似乎不仅仅在使用“+=”时。 UITextView 和 UILabel 似乎都有很多很多问题,只是在您经常更改文本的情况下。真是可笑。
  • 您可以很容易地对此进行测试,只需将相同的短文本分配给 UITextView(或标签)数千次即可。这太疯狂了,Apple。
【解决方案2】:

你的设计真的错了。单个 UITextView 中不应包含 50kb 的文本。您应该做的是将该文本拆分为页面。所以你有多个 UITextViews 页面(可重复使用的 Viewcontroller)。

编辑:我有另一个想法,您如何使用 WKWebView 作为您的编辑器。我相信它不会滞后。但是你需要 CSS/HTML 方面的专业知识。

【讨论】:

  • UITextView 是一个代码/脚本编辑器。所以分页既不方便又不寻常,除非它可以对用户不可见。
  • @BramBos 您对我编辑的答案有何看法?我认为它可以工作。
  • 50kb 的文本在文本视图中算不了什么,与问题无关。
猜你喜欢
  • 2016-09-05
  • 1970-01-01
  • 2013-05-15
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多