【问题标题】:memory leak with method NSRegularExpression.matchesInString()使用方法 NSRegularExpression.matchesInString() 的内存泄漏
【发布时间】:2015-12-20 08:16:45
【问题描述】:

我已经意识到matchesInString 方法存在内存泄漏。 我做错了什么,还是这真的是泄漏的核心方法? 如果泄漏,使用正则表达式的替代方法是什么? (我知道我可以自己编写代码,但我正在寻找可重用的东西) 我的代码只是试图删除字符串的一些特定参数。

    print ("Memory Leak Test ");
    for var i in 1...1000000 {

        print("Memory Leak Test " + String(i));

        let sMyString:String="opacity:0.71889403;fill:#0000ff;fill-opacity:1;stroke:#0000ff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline\"/></svg>"
        var stringsuche:String = "fill:(.*?);";
        let regex = try! NSRegularExpression(pattern: stringsuche, options: [])
        let results = regex.matchesInString(sMyString, options: [], range: NSMakeRange(0, sMyString.length))
    }
    print("End  Memory Leak Test ");

更新 我只是为此编写了自己的代码,但是这种经历给我一种不好的感觉。我想有很多核心方法正在泄漏。刚刚发现“stringByTrimmingCharactersInSet”和“stringByReplacingOccurrencesOfString”也泄漏了!

func getstylevalue(styleprop:String, text:String) -> String{

    var returnvalue="";

    let stringsuche:String=styleprop;
    let indexstart=text.indexOf(stringsuche);
    if indexstart == -1 {
        return returnvalue;
    }else{
        let indexend=text.indexOf(";", startIndex: indexstart) ;
        if indexend == -1 {
            return returnvalue;
        }else{
            returnvalue=text.substring(indexstart + stringsuche.length, endIndex: indexend);
            return returnvalue;
        }
    }
}

内存泄漏与修剪:

print("Start  Memory Leak Test ");
for i in 1...1000000 {
    let theword:String="     bla     ";
    let temp:String = theword.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())
}
print("End  Memory Leak Test ");

【问题讨论】:

标签: swift memory-leaks


【解决方案1】:

尝试autoreleasepool {} 解决内存周期(泄漏)问题。

extension String {

    func regexSearch(pattern pattern: String) -> [String] {
        let nsString: NSString = NSString(UTF8String: self)!
        var stringGroupMatches = [String]()

        do {
            let regex = try NSRegularExpression(pattern: pattern, options: [])
            let nsRangeAll = NSRange(location: 0, length: nsString.length)

            autoreleasepool {
                let matches = regex.matchesInString( nsString as String, options: [], range: nsRangeAll) 

                for match: NSTextCheckingResult in matches {
                    let rangeCount = match.numberOfRanges
                    // remember: $0th match is whole pattern
                    for group in 0 ..< rangeCount {
                        let r: NSRange = match.rangeAtIndex(group)
                        stringGroupMatches.append(nsString.substringWithRange(r))
                    }
                }
            }
            return stringGroupMatches
        }
        catch {
            return []
        }
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 2015-02-17
    • 2013-08-13
    • 2015-03-24
    • 2014-03-10
    相关资源
    最近更新 更多