Доступ к синглетонам при закрытии = утечка памяти? - PullRequest
0 голосов
/ 02 июня 2018

Вызывает ли доступ к одиночному объекту в замыкании цикл сохранения?

В частности, что-то вроде этого примера:

class TheSingleton
{
    static let shared = TheSingleton() //THE SINGLETON

    enum Temperature              //An associated enum
    {
        case cold, hot
    }

    var currentTemp: Temperature? //A non-class-type variable
    var aPicture: UIImage?        //A class-type variable

    func giveMeFive() -> Int      //A function
    {
         return 5
    }

    //Pay attention to this
    func doSomething(onDone: @escaping (Int) -> ())
    {
         OtherSVC.upload("Mr. Server, do async stuff plz") { (inImage) in
             TheSingleton.shared.currentTemp = .cold
             TheSingleton.shared.aPicture = inImage
             onDone(TheSingleton.shared.giveMeFive())
         }
    }
}
//Fire the thing
TheSingleton.shared.doSomething { _ in}

Если это так, я действительно не знаю, как написать перехватсписок для этого ...

[weak TheSingleton.shared] (inImage) in

Вы не можете сделать это ^

Я включил три случая, потому что, возможно, тип данных имеет значение?Я думаю, что мне не хватает некоторых основ в списках захвата и циклах сохранения замыканий.

Все, что я знаю, это всякий раз, когда ты получаешь доступ к чему-то вне фигурных скобок замыкания, ты должен отменить / ослабить его, если это тип классаобъект.Это потому, что замыкания создают сильные ссылки по умолчанию.

Я думал, что могу быть дерзким и обойти циклы, вызывая весь синглтон в замыканиях, но я, вероятно, туп, закрывая глаза.

Было бы решение сделать что-то вроде:

var updateDis = TheSingleton.shared.aPicture
OtherSVC.upload("ugh this is lame, and more work") { [unowned updateDis] inPic in 
    updateDis = inPic
}

?

1 Ответ

0 голосов
/ 02 июня 2018

Поскольку вы пишете синглтон, TheSingleton.shared почти всегда будет таким же, как self, поэтому вместо этого захватите unowned self или weak self.Я бы предпочел weak здесь, потому что self почти всегда будет сохраняться классом и будет освобождено только после завершения приложения.

OtherSVC.upload("Mr. Server, do async stuff plz") { [unowned self] (inImage) in
    self..currentTemp = .cold
    self.aPicture = inImage
    onDone(self.giveMeFive())
}
...