Nie jestem pewien, czy to właśnie się z tobą dzieje, ale to mi się przydarzyło i okazało się, że jest to konsekwencja modelu pamięci wewnętrznej Swifta, a konkretnie, jak radzi sobie z słabymi i niezarejestrowanymi referencjami.
Aby to się do Ciebie odnosiło, coś musiało mieć słabe lub niezmienione odniesienie do twojego obiektu użytkownika.
W takim przypadku, po usunięciu ostatniego silnego odniesienia do obiektu, obiekt zostanie dezinicjowany - wszystko, co się do niego odniesie, będzie miało zmniejszoną liczbę odnośników i zostanie zwolnione w razie potrzeby, a jego metoda deinit() zostanie uruchom (jak pokazują twoje logi). Jednak nie zostanie on zdekallocated deallocated.
Tak, obiekt można zdezynfekować, ale nie zwolnić! Powodem tego jest to, że słabe lub niezmienione odniesienie tego punktu na tym obiekcie nie może wskazywać na zwolnioną (lub gorzej przydzieloną) pamięć, ponieważ podążanie za tym wskaźnikiem powodowałoby "niebezpieczne" zachowanie. W rezultacie ta część pamięci nie może zostać zrezygnowana, a zatem obiekt nie jest zwolniony.
Jednak dwie dobre wiadomości. Po pierwsze, przecieka tylko ten konkretny obiekt - żaden z obiektów, do których się odwołuje. Oznacza to, że wycieka tylko niewielka część pamięci. To może nie być wielka sprawa. Po drugie, w przypadku słabych referencji, zachowanie to zostało zmienione w Swift 4 (niestety referencje bez właściciela nadal będą miały takie zachowanie).Ciekawie byłoby wypróbować swój projekt w wersji beta Xcode9 i sprawdzić, czy nadal się dzieje.
To wszystko polega na zadawaniu tego samego pytania w WWDC. Mam nadzieję, że okaże się to możliwe!
nadal masz ten problem? –