Swift Struct Memory Leak

Staramy się używać struktur Swift tam, gdzie możemy. Używamy również RxSwift, który ma metody, które przyjmują zamknięcia. Kiedy mamy strukturę, która tworzy zamknięcie, które odnosi się do jaźni , to tworzy silny cykl odniesienia .

import Foundation
import RxSwift

struct DoesItLeak {

    var someState: String = "initial value"
    var someVariable: Variable<String> = Variable("some stuff")

    let bag = DisposeBag()

    mutating func someFoo() {

        someVariable.subscribeNext { person in

            self.someState = "something"
        }
        .addDisposableTo(bag)
    }
}
Skąd mam to wiedzieć? Jeśli stworzę 100,000 obiektów Donitleak i wywołam someFoo() na każdym z nich, wierzę, że mam 100,000 obiektów z silnymi cyklami odniesienia. Innymi słowy, kiedy pozbędę się tablicy Donitleak zawierającej te obiekty, obiekty pozostają w pamięci. Jeśli nie wywołam someFoo (), nie ma problemu.

Zmienna jest klasą. Tak, mogę zobaczyć ten problem z pamięcią za pomocą przydziałów instrumentów xcode i filtrowanie w zmienna

Filtrowanie Według Zmiennej

Tutaj wpisz opis obrazka

Jeśli spróbuję użyć [weak self], tak jak w poniższym, dostaję błąd kompilatora:

someVariable.subscribeNext { [weak self] person in

Błąd kompilatora to "słaby nie może być zastosowany do typu nie-klasowego"

W kod rzeczywisty / Nie-przykładowy, uzyskujemy dostęp do metod i zmiennych poprzez self i jest to problem z pamięcią.

Jak mogę rozwiązać ten problem z pamięcią, zachowując strukturę DoesItLeak a?

Dzięki za pomoc.
Author: finneycanhelp, 2015-12-22

2 answers

Jako Darren umieścił to w komentarzach: "Dositleak nie może być strukturą " nie możemy pozwolić, aby DoesItLeak była strukturą i bezpiecznie rozwiązała problem silnego cyklu odniesienia.

Typy wartości, takie jak struktury, istnieją na ramce stosu. Zamknięcia i klasy są typami referencyjnymi.

Jak podaje silne cykle odniesienia dla sekcji zamknięć:

Ten silny cykl odniesienia występuje, ponieważ zamknięcia, podobnie jak klasy, są typami odniesienia.

Ponieważ struktura ma Variable klasa i zamknięcie odnoszące się do self jest przechowywane w klasie Variable za pomocą subscribeNext, tworzy silny cykl odniesienia. Zobacz "Rozwiązywanie silnych cykli referencyjnych dla zamknięć" w automatycznym zliczaniu odniesień dokumentacji Apple.

 5
Author: finneycanhelp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:25:54

Wzorzec przechwytywania siebie przez ucieczkowe zamknięcie w zapisywalnym kontekście jest teraz zabroniony. Kompilator swift wyświetli błąd "Closure can implicite capture a mutating self parameter". Jeśli kontekst jest tylko do odczytu, wartość self może zostać skopiowana lub udostępniona i w obu przypadkach nie będzie cyklu odniesienia.

 0
Author: Berik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-26 14:31:37