Swift delegation-kiedy używać słabego wskaźnika na delegata

Czy ktoś może wyjaśnić kiedy i kiedy nie używać 'słabego' przypisania do wskaźnika delegata w Swift i dlaczego?

Rozumiem, że jeśli używasz protokołu, który nie jest zdefiniowany jako klasa, nie możesz ani nie chcesz przypisać wskaźnika delegata do słabego.

protocol MyStructProtocol{
    //whatever
}

struct MyStruct {
    var delegate: MyStructProtocol?
}

Jednak, gdy twój protokół jest zdefiniowany jako protokół typu klasy, to chcesz ustawić swojego delegata na słaby wskaźnik?

protocol MyClassProtocol:Class{
    //whatever
}

class MyClass {
    weak var delegate: MyClassProtocol?
}
Mam rację? W Przewodniku Swift firmy Apple nie ma przykładów protokołu klasowego używając słabych przydziałów, ale w moich testach widzę silne cykle Odniesienia, jeśli moi delegaci nie są słabo odwołani.
Author: nwales, 2015-05-05

3 answers

Ogólnie czyni się protokoły klas (zdefiniowane za pomocą słowa kluczowego class) słabymi, aby uniknąć ryzyka " silnego cyklu odniesienia "(wcześniej znanego jako"cykl zachowywania"). Brak osłabienia delegata nie oznacza, że z natury masz silny cykl odniesienia, ale tylko to, że możesz mieć go.

W przypadku typów struct ryzyko silnego cyklu odniesienia jest znacznie zmniejszone, ponieważ typy struct nie są typami "referencyjnymi", więc trudniej jest stworzyć silny cykl odniesienia. Ale jeśli obiekt delegata jest obiektem klasy, to możesz chcieć uczynić protokół protokołem klasy i uczynić go słabym.

Moim zdaniem, osłabianie delegatów klasowych jest tylko częściowo w celu zmniejszenia ryzyka silnego cyklu odniesienia. To naprawdę kwestia "własności". Większość protokołów delegatów to sytuacje, w których przedmiot, o którym mowa, nie ma prawa własności do delegata, a jedynie gdy przedmiot, o którym mowa, zapewnia możliwość poinformowania delegata o coś (lub poproś o coś).

 38
Author: Rob,
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
2015-05-05 17:13:11

Delegaci powinni (edit: ogólnie) być zawsze słabi.

Powiedzmy, że b Jest delegatem a. Teraz a'S delegate właściwością jest b.

W przypadku, gdy chcesz b zwolnić, gdy c zniknie

Jeśli c posiada silne odniesienie do b i c deallocates, chcesz b deallocate z c. Jednak korzystanie z silnej własności delegata w a, b nigdy nie zostanie dealokowany, ponieważ {[1] } mocno trzyma się b. Korzystanie z słabe odniesienie, gdy tylko b straci silne odniesienie z c, b będzie dealloc kiedy c deallocs.

Zazwyczaj jest to zamierzone zachowanie, dlatego chcesz użyć właściwości weak.

 5
Author: Schemetrical,
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-02-08 04:31:57
protocol MyDelegate: class {
// ...
}
class MyViewController: UIViewController {
    weak var delegate: MyDelegate? 
}
 -4
Author: Ivailo Kanev,
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
2016-04-06 19:54:58