NSAttributedStrings 内存泄漏

bpe*_*dit 5 memory-leaks nsattributedstring ios swift

我的应用程序像书一样,有 77 章,每章由几页组成。在每一页上,文本以UITextView. 用于此的数据存储在类型为 的字典中[String: [NSAttrubutedString]]。键是章节,与每个章节关联的数组元素是该章节中每个页面的字符串。

当应用程序首次启动时,Instruments 显示接近 1800 次内存泄漏。我有时会在访问其他页面时看到 1 到 17 个更多的泄漏,但这种情况很少见且不可预测。1800 各不相同,并且只出现一次。使用非属性Strings时我没有这样的问题。我还可以补充一点,这是我第一次使用属性字符串。

每个泄漏的一个示例(该类型的总大小):
* Malloc / [NSConcreteMutableAttributedString replaceCharactersInRange:withString:] / 171 kB
* Malloc 80 Bytes / -[NSRLEArray_makeNewListFrom:] 17 kB
* _NSCFString / -[NSPlaceholderMutableString init
* Malloc / [NSMutableRLEArray_setBlockCapacity:] / 25 kB
* NSConcreteMutableAttributedString / _decodeObjectBinary 12 kB

虽然我使用可变版本来形成我的字符串,但我将它们作为非可变NSAttributedString版本插入到数组中。plist当应用程序启动时,数组字典被归档为然后读入相同类型的字典。我认为这可能是问题所在,但尝试直接从存档中读取会产生相同的泄漏。我不知道为什么泄漏的对象读作可变的。

我不确定哪些代码(如果有)会在这里有帮助,请告诉我。

编辑:我已经用数组替换了字典,[[NSAttributedString]]但仍然有同样的问题。至少三个泄漏类别似乎与相同的字符串相关,每个类别的泄漏数量大致相同。

编辑:我通过实时创建字典viewDidLoad而不是从档案中读取它来消除我的泄漏。但我仍然很好奇为什么这种行为是属性字符串而不是字符串。