存在换行符时UITextView内存泄漏

时间:2016-07-14 03:08:08

标签: ios swift uitextview

当我想用UITextView填充字符串时,我的整个应用程序会冻结。

这冻结了应用程序:

let testStringLineBreaks = "foooooo \n \n barrrrrr"
self.biographyTextView.text = testStringLineBreaks

这不会冻结应用程序:

let testStringNoLineBreaks = "foooooobarrrrrr"
self.biographyTextView.text = testStringNoLineBreaks

为什么呢?我该如何解决?我需要能够在我的UITextView上使用换行符,因为这是用户填写其个人资料描述的地方。

enter image description here

该应用程序使用大约60 MB。然而,当它被困在线上时:

self.biographyTextView.text = testStringLineBreaks

它持续上升大约每秒2 mb。我以183 mb的价格杀了这个应用程序。

它只发生在iOS 8而不是iOS 9上。

import UIKit

class GFTextView: UITextView {
    let bottomBorder = CALayer()

    @IBInspectable var haveBottomBar:Bool?

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.textContainer.lineFragmentPadding = 0
    }

    func addBottomBar(){
        bottomBorder.frame = CGRectMake(0.0, self.frame.size.height - 1, self.frame.size.width, 1.0);
        bottomBorder.backgroundColor = UIColor.grayColor().CGColor
        self.layer.addSublayer(bottomBorder)
    }

    override func becomeFirstResponder() -> Bool {
        let shouldBecomeFirstResponder = super.becomeFirstResponder()
        bottomBorder.backgroundColor = shouldBecomeFirstResponder ? Constant.ui_applicationMainColor.CGColor : Constant.ui_applicationMainColor.CGColor
        return shouldBecomeFirstResponder
    }

    override func resignFirstResponder() -> Bool {
        let shouldResignFirstResponder = super.resignFirstResponder()
        bottomBorder.backgroundColor = shouldResignFirstResponder ? UIColor.grayColor().CGColor : Constant.ui_applicationMainColor.CGColor
        return shouldResignFirstResponder
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        if let font = self.font {
            self.font = GFFont.fontForDefaultFontName(font.fontName, size: font.pointSize)
        } else {
            self.font = UIFont.systemFontOfSize(12)
        }
        bottomBorder.backgroundColor = UIColor.grayColor().CGColor
    }
}

2 个答案:

答案 0 :(得分:1)

基于您只从自定义UITextView子类中获取错误的事实,问题显然来自您的实现。

最可能的原因是您实施了layoutSubview功能。在重写函数中你应该做的唯一事情是根据需要调整帧。

设置字体可能会导致对layoutSubviews或类似事件的递归调用。

应在init功能中设置背景颜色。设置字体应该在以后完成,因为它取决于调用init时不会设置的属性的值。设置字体的最佳位置是覆盖font属性的setter。

答案 1 :(得分:0)

我在这里看到类似的问题: Swift - Split string over multiple lines

但我只是尝试使用xcode Version 7.3.1(7D1014)部署目标9.3来执行您的代码。这对我来说可以。可能是之前的问题,但已经解决了最新版本的swift。

@IBOutlet弱变多行:UITextView!     override func viewDidLoad(){         super.viewDidLoad()         让testStringLineBreaks =“foooooo \ n \ n barrrrrr”

    self.multiline.text = testStringLineBreaks
    // Do any additional setup after loading the view.
}