Memory Leak of Dictionary used in singleton


(Ekaterina Belinskaya) #1

Hi everyone!

I have singleton. It contains a 2 dictionaries.

struct Stat {
    var statHash:String
    var displayDescription:String
    var displayName:String
    var displayIcon:String
    var statIdentifier:String
}

class Singleton {

    static let sharedInstance = Singleton()

    var statsDesc = [String:Stat]()
    var test = [String: String]()

    init() {
        test["a"] = "b"
    }
}

let singlton = Singleton.sharedInstance
On using the leaks tool, I am getting a memory leak of the second dictionary(String, String).

screenshot of memory graph debugger <http://imgur.com/a/JRcGd>

If i remove dictionaries and write smth like that:

class Singleton {
    
    static let sharedInstance = Singleton()
    var num: Int
    
    init() {
        num = 3
    }
}
leak disappears.

Could someone, please, explain why this happens?

Thanks for the help.

Kate


(Quinn “The Eskimo!”) #2

In general a leak that you can reproduce with simple code snippets like this is Just a Bug™, and you should file it as such. It would help if you included a runnable test project that reproduces the problem.

<https://bugs.swift.org/>

Please post your bug number, just for the record.

Share and Enjoy

···

On 12 Mar 2017, at 00:04, Ekaterina Belinskaya via swift-users <swift-users@swift.org> wrote:

Could someone, please, explain why this happens?

--
Quinn "The Eskimo!" <http://www.apple.com/developer/>
Apple Developer Relations, Developer Technical Support, Core OS/Hardware


(Joe Groff) #3

This sounds a lot like:

https://bugs.swift.org/browse/SR-3661 Memory Leak from Multiple Dictionary Properties

which was fixed in Xcode 8.3. What version of the compiler are you using?

-Joe

···

On Mar 11, 2017, at 4:04 PM, Ekaterina Belinskaya via swift-users <swift-users@swift.org> wrote:

Hi everyone!

I have singleton. It contains a 2 dictionaries.

struct Stat {
    var statHash:String
    var displayDescription:String
    var displayName:String
    var displayIcon:String
    var statIdentifier:String
}

class Singleton {

    static let sharedInstance = Singleton()

    var statsDesc = [String:Stat]()
    var test = [String: String]()

    init() {
        test["a"] = "b"
    }
}

let singlton = Singleton.sharedInstance
On using the leaks tool, I am getting a memory leak of the second dictionary(String, String).

screenshot of memory graph debugger <http://imgur.com/a/JRcGd>

If i remove dictionaries and write smth like that:

class Singleton {
    
    static let sharedInstance = Singleton()
    var num: Int
    
    init() {
        num = 3
    }
}
leak disappears.

Could someone, please, explain why this happens?