2011-08-24 5 views
2

제 상황으로 저는 "Person"과 "Group"의 두 클래스가 있습니다. 모든 사람에게 NSArray가 속해있는 모든 그룹을 복원합니다. 모든 그룹에는 NSAraay가있어 모든 사람을 그 그룹에 속하게합니다.NSArray를 처리 할 때 유지주기를 피하는 방법 (기본적으로 객체를 유지함)?

한 사람이 많은 그룹에 속할 수 있고 한 그룹에는 많은 사람들이 속할 수 있습니다.

그리고 이것은 일종의 보유 생각입니다. 사람은 그 사람에게 돌아가는 NSArray를 보유하는 그룹을 유지하는 NSArray를 보유합니다.

그러나 나는 모든 사람이 속한 그룹을 알고 모든 그룹이 그 사람이 그 그룹에 속한다는 것을 알고 있어야한다고 생각합니다.

어떻게 해결할 수 있습니까?

NSArray는 모든 멤버를 보유하지 않으므로 사이클을 중단하지만 분명히 NSArray는 유지해야합니다. 따라서 몇 가지 조언을 제공해주십시오.

답변

0

일반적으로이를 달성하려면 약한 참조 시스템이 필요합니다. 보유하지 않는 CFArray를 사용할 수 있지만 retain/release 시스템을 우회하는 것은 위험합니다. 이것을 허용하는 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 

구체적인 경우에 대해 말씀 드리지만이 문제를 완전히 피하기 위해 클래스를 구성하는 더 좋은 방법이 없는지 확인해보십시오.

0

앱 시작에 걸쳐이 데이터를 유지해야한다는 질문을 읽은 것 같습니다. 완전히 잘못된 것일 수 있습니다. 이것이 사실이라면 CoreData & Person & 그룹의 데이터베이스 엔티티를 작성해야합니다. 이 경우 CoreData는 모든 참조를 관리합니다 & '&'그룹의 인원을 'SQL과 같은 쿼리'를 사용하여 가져올 수 있습니다.

이것이 사실이 아니라면, 직접적인 참조가 아닌 간접 참조를 저장하는 것이 내 마음에 오는 간단한 해결책입니다. 예를 들어, 각 개인 또는 그룹은 ID가 있어야합니다 (NSString라고 말하십시오). 그런 다음 각 Person 클래스는 NSString (그룹이 속한 그룹에 해당하는 그룹 ID)의 배열을 저장합니다. & 각 그룹 클래스는 NSString (구성원에 해당하는 개인 ID)의 배열을 저장합니다. 이를 통해 &과 같은 쌍을 저장하는 Map/Dictionary 구조를 유지해야합니다.이 구조에서 ID를 찾습니다.

HTH,

하기 Akshay

관련 문제