Как избежать сохранения цикла при работе с NSArray (который сохраняет объект по умолчанию)? - PullRequest
2 голосов
/ 24 августа 2011

Моя ситуация такова, что у меня есть два класса: «Человек» и «Группа».У каждого человека есть NSArray, который восстанавливает каждую группу, к которой он принадлежит.В каждой группе есть NSAraay, который восстанавливает каждого человека, принадлежащего ему.

И один человек может принадлежать ко многим группам, а одна группа может иметь много людей, принадлежащих ему.

И этоЯ думаю, что это своего рода счет удержания. Человек сохраняет NSArray, который сохраняет группу, которая сохраняет NSArray, который сохраняет его обратно.

Но я думаю, мне нужно, чтобы каждый человек знал, к какой группе он принадлежит, и каждыйГруппа знает, что люди принадлежат ему.

Как я могу решить это?

Я думаю, что NSArray не сохраняет всех своих членов, которые могли бы разорвать цикл, но, очевидно, NSArray должен их сохранить.Поэтому, пожалуйста, дайте несколько советов.

Ответы [ 3 ]

2 голосов
/ 24 августа 2011

Вы можете использовать [NSValue valueWithNonretainedObject:...], чтобы поместить ваши объекты в массив, не сохраняя их.Я не уверен, что это лучшее решение, но оно будет работать.

0 голосов
/ 24 августа 2011

Кажется, что после прочтения вопроса вам необходимо сохранить эти данные при каждом запуске приложения (я могу быть совершенно неправ). Если это правда, вы должны взглянуть на CoreData и создать объекты базы данных для Person & Group. В этом случае CoreData будет управлять всеми вашими ссылками, и вы сможете получать «людей в группе» и «группы людей», используя запросы, подобные SQL.

Если это не так, мне приходит в голову простое решение - хранить косвенные ссылки, а не прямые ссылки. Например, у каждого человека или группы должен быть идентификатор (скажем, это NSString). Затем каждый класс Person будет хранить массив NSString s (идентификаторы групп, соответствующие группам, к которым он принадлежит), а каждый класс Group будет хранить массив NSString s (идентификаторы лиц, соответствующих его членам). При этом вам нужно будет поддерживать структуру Map / Dictionary, в которой хранятся такие пары, как и искать идентификаторы в этой структуре.

НТН,

Акшай

0 голосов
/ 24 августа 2011

В общем, для этого вам понадобится слабая система ссылок. Вы можете использовать не сохраняющий CFArray, но обход системы удержания / выпуска опасен. Вот быстрая и грязная категория на NSMutableArray, чтобы учесть это.

@implementation NSMutableArray (WeakReferences)
    + (id)mutableArrayUsingWeakReferences {
    return [self mutableArrayUsingWeakReferencesWithCapacity:0];
    }

    + (id)mutableArrayUsingWeakReferencesWithCapacity:(NSUInteger)capacity {
    CFArrayCallBacks callbacks = {0, NULL, NULL, CFCopyDescription, CFEqual};
    // We create a weak reference array
    return (id)(CFArrayCreateMutable(0, capacity, &callbacks));
    }
@end

В вашем конкретном случае я бы сделал шаг назад и посмотрел, нет ли лучшего способа структурировать ваши классы, чтобы полностью обойти эту проблему.

...