<div dir="ltr"><br><div><div><br></div><div><br></div><div>Hi everyone,</div><div><br></div><div>I am working on <a href="https://bugs.swift.org/browse/SR-3536">https://bugs.swift.org/browse/SR-3536</a></div><div><p>There is a memory leak when searching for the substring of a string using regular expression.</p></div><div><br></div><div><pre style="box-sizing:border-box;font-family:consolas,&#39;liberation mono&#39;,menlo,courier,monospace;font-size:11.899999618530273px;margin-top:0px;margin-bottom:16px;line-height:1.45;word-wrap:normal;padding:16px;overflow:auto;background-color:rgb(247,247,247);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;color:rgb(51,51,51)"><code style="box-sizing:border-box;font-family:consolas,&#39;liberation mono&#39;,menlo,courier,monospace;padding:0px;margin:0px;background-color:transparent;border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;word-break:normal;border:0px;display:inline;overflow:visible;line-height:inherit;word-wrap:normal">import Foundation

let myString = &quot;Foo&quot;
for _ in 1...10000 {
  let _ = myString.range(of: &quot;bar&quot;, options: .regularExpression)
}</code></pre><p style="color:rgb(0,0,0);font-family:helveticaneue;font-size:12px"><br></p><p style="color:rgb(0,0,0);font-family:helveticaneue">From the above test case i could see that over a period of time, around 60 Mb of memory was leaked. </p><p style="color:rgb(0,0,0);font-family:helveticaneue">I see in String.range we eventually call NSString._createRegexForPattern. Here we maintain a mapping between NSString and NSRegularExpression object in NSCache&lt;NSString, NSRegularExpression&gt;. All the entries in the cache are maintained in a dictionary ( _entries ) which takes the UnsafeRawPointer as the key, which seems to be the address of the NSString Object and NSCachedEntry as value.</p><p style="color:rgb(0,0,0);font-family:helveticaneue">Though the pattern is of type String, it is stored in the NSCache as NSString. And since we are storing the NSCachedEntry objects in a dictionary indexed by the address (UnsafeRawPointer) of the NSString object, there is a new cache entry created for each iteration ( in the test case ) though the pattern string remains the same.</p><p style="color:rgb(0,0,0);font-family:helveticaneue">Can someone guide me about how to go about resolving this issue.</p><p style="color:rgb(0,0,0);font-family:helveticaneue">Thank you.</p><p style="color:rgb(0,0,0);font-family:helveticaneue">- Nethra Ravindran</p><p></p></div></div></div>