2016-05-09 4 views
2

Могу ли я иметь класс «Личность», который имеет переменную «bestFriend», которая имеет тип «Лицо»? Если да, то как я могу предотвратить сильный опорный цикл возникновения? Я могу объявить переменную нормально, но я получаю сообщение об ошибке, когда я пытаюсь объявить как слабый или неактивный.Может ли класс содержать ссылочную переменную самому себе?

class Person: NSManagedObject { 
    @NSManaged var name:String? 
    @NSManaged var age:Int? 
    @NSManaged var bestFriend:Person? 
} 

Если я пытаюсь объявить переменную как так:

@NSManaged weak var bestFriend:Person? //This generates an error 

или

@NSManaged unowned var bestFriend:Person? //This generates an error 

ошибка - "свойство 'BestFriend' отмечен слабым по классу человек не может. сгенерируйте для него метод setter. "

Update

Класс теперь подкласс NSManagedObject так что я могу хранить его с помощью CoreData. Я немного изменил свой код, чтобы отразить это. Та же проблема сохраняется. Как я могу предотвратить сильный опорный цикл? Я не могу объявить переменную «bestFriend» как «слабую» или «незаслуженную», не создавая ошибку, указанную выше.

+2

Действительно ли ваш вопрос о наличии ссылки на тот же тип, что и сам или тот же объект, что и сам? Предположительно, у вас не было бы самого лучшего друга (или вы бы)? В этом случае ваш вопрос заключается в наличии переменной, которая имеет тот же * тип *, а не переменную того же * экземпляра * (поскольку человек и их лучший друг не являются одним и тем же объектом). В любом случае, вы можете это сделать, но, похоже, вы можете вводить в заблуждение типы (классы) с экземплярами этих типов? – Gruntcakes

+0

@sausageMachine yes Я хочу иметь переменную того же типа, а не одного человека. – user3353890

+0

@matt код причины ошибки находится выше. он падает в объявлении класса, где я объявляю переменную bestFriend, если пытаюсь объявить ее как «слабый var» или «unowned var» – user3353890

ответ

2

Является ли человек подтипом NSManagedObject? Если да, то свойства должны быть сильными. И это может привести к сильным опорным циклам. Вы должны определенно разбить их:

Преодолевая сильные ссылки между объектами

В отличии от поведения по умолчанию между управляемыми объектами и их управляемыми контекстами объектов, с отношениями между управляемыми объектами, каждый объект сохраняет сильную ссылку объект или объекты, с которыми он связан. Эта взаимосвязь может вызывать сильные ссылочные циклы, которые, в свою очередь, могут привести к тому, что объекты будут храниться в памяти задолго до их полезности. Чтобы гарантировать, что ссылочные циклы будут разбиты, когда вы закончите с объектом, вы можете использовать метод контекста управляемого объекта refreshObject: mergeChanges: превратить управляемый объект в ошибку.

(от CoreData Programming Guide).

+0

, да, они являются подтипом NSManagedObject. Спасибо за информацию, это действительно полезно! :) – user3353890