Dlaczego MonoTouch GC nie może zabijać zarządzanych obiektów za pomocą refcount> 1?

Myślę, że zbliżam się do zrozumieniajak żyją razem Mono GC i ObjC ref.

Sposób działania polega na tym, że gdy obiekt natywny ma liczbę referencyjną równą 1, nie zapobiegamy gromadzeniu śmieci przez zarządzaną instancję.Jak tylko liczba referencyjna wzrośnie powyżej 1, uniemożliwiamy zarządzanej instancji pobieranie śmieci.

Dzieje się tak, ponieważ obiekt zarządzany może zawierać stan użytkownika. W przypadku obiektów zarządzanych, które odzwierciedlają odpowiedni obiekt rodzimy (taki jak zarządzana instancja UIView), MonoTouch wie, że instancja nie może zawierać żadnego stanu, więc gdy żaden kod zarządzany nie ma odniesienia do zarządzanej instancji, GC może go zebrać. Jeśli instancja zarządzana jest wymagana na późniejszym etapie, po prostu tworzymy nową.

Więc jeśli tworzęCustomButton to dziedziczyUIButton, dodaj go jako widok podrzędny do mojegoView, pozwól zarządzanemu odwołaniu wyślizgnąć się z zakresu, a następnie uruchom GCzarządzany CustomButton nadal nie będzie kwalifikować się do odbioru.

Dlaczego nie można go zebrać? Oczywiście może to być stan zarządzany jak właściwości,ale jeśli nie ma linku do niego z zarządzanych obiektów, kto dba o ten stan? Równie dobrze może po prostu zniknąć, dlaczego nie?

Myślę o jednym z możliwych powodów: subskrybowanieCustomButton wydarzenia nie utrzymają go przy życiu dla GC, więc gdy obiekt zostanie zebrany, wydarzenia przestają strzelać. Może to spowodować nieoczekiwane zachowanie.

Czy to jest poprawne? Czy istnieją inne powody, aby utrzymać zarządzany obiekt przy życiu, nawet jeśli nikt go nie łączy?

questionAnswers(1)

yourAnswerToTheQuestion