Здесь есть два вопроса:
Как уже отмечали другие, в общем, когда у вас есть два или более ссылочных типа, ссылающихся друг на друга, вам нужно сделать одну из этих ссылок weak
, чтобы разорвать цикл сильных ссылок. См. Разрешение сильных эталонных циклов между экземплярами класса .
Более серьезная проблема в том, что у вас бесконечный цикл. init
из Base
создает новый экземпляр Referenced
, но init
из Referenced
создает другой экземпляр Base
(который передается в экземпляр Native
). Этот новый экземпляр Base
затем создаст другой экземпляр Referenced
, повторяя процесс, и будет продолжать это делать, пока не исчерпает память / стек.
Добавьте операторы print
в различные методы init
, и вы увидите этот бесконечный цикл в действии.
Вам следует вернуться к этой модели, определить график «владения». Родительские объекты могут сохранять надежные ссылки на дочерние объекты (и, возможно, создавать экземпляры дочерних объектов, если это необходимо), но дочерние объекты должны сохранять только ссылки weak
на свои родительские объекты (и, скорее всего, не создавать экземпляры новых родительских объектов).
Например, вы можете сделать:
class Parent {
var child: Child?
init() {
self.child = Child(parent: self)
}
deinit {
print("deinit called")
}
}
class Child {
weak var parent: Parent?
init(parent: Parent) {
self.parent = parent
}
}
И
func testMe() {
var parent: Parent? = Parent()
parent = nil // in this case, this is unnecessary because `parent` is a local variable, but this is here for illustrative purposes; but note that we don’t have to `nil` the `child`
}
Здесь вы создаете экземпляр объекта Parent
, который создается для создания экземпляра дочернего элемента. Но обратите внимание, что:
Parent
предоставляет себя в качестве параметра для Child
;
Child
поддерживает только ссылку weak
на Parent
; и
Очевидно, что Child
не создает экземпляр нового Parent
, а просто использует ссылку, предоставленную ему.
Вы также можете сделать это с вашим Native
struct
, но идея будет та же: разорвать цикл сильных ссылок с помощью ссылки weak
и избежать бесконечного цикла.
Честно говоря, в этих случаях абстрактные имена типов приводят к излишней путанице в примерах. Если вы поясните, что на самом деле представляют эти различные типы, на практическом примере из реальной жизни, модель собственности, несомненно, станет более очевидной.