我的情况是我有两个类:“人”和“组”。 在每个人中,它都有一个NSArray,可以恢复它所属的每个组。 在每个群体中,它都有一个NSAraay,可以恢复属于它的每个人。
一个人可以属于许多群体,一个群体可以有很多人属于它。
这是一种保留计数我认为,一个人保留了一个NSArray,它保留了一个保留NSArray的集团,该集团保留给该人。
但我认为我确实需要每个人知道它属于哪个群体,并且每个群体都知道这些群体属于它。
我该如何解决这个问题?
我认为NSArray并没有保留所有会破坏周期的成员,但显然NSArray必须保留它们。所以请提供一些建议。
答案 0 :(得分:2)
您可以使用[NSValue valueWithNonretainedObject:...]
将对象放入数组中而不保留它们。我不确定这是否是最佳解决方案,但它会起作用。
答案 1 :(得分:0)
通常,您需要一个弱的引用系统来实现这一目标。您可以使用非保留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
对于您的具体情况,我会退后一步,看看是否有更好的方法来构建您的类以完全避免这个问题。
答案 2 :(得分:0)
在阅读完问题后,您需要在应用启动时保留此数据(我可能完全错了)。如果这是真的,你应该看看CoreData&为Person&创建数据库实体组。在这种情况下,CoreData将管理您的所有参考资料和你可以取“群体中的人”和“使用SQL查询的人群”。
如果不是这样,我想到的一个简单的解决方案是存储间接引用而不是直接引用。例如,每个人或组都应有一个ID(假设它是NSString
)。然后,每个Person类将存储一个NSString
s的数组(对应于它所属的组的组ID)&每个Group类将存储一个NSString
s数组(与其成员对应的人员ID)。有了这个,你需要维护一个Map / Dictionary结构来存储像&这样的对。在这个结构中查找ID。
HTH,
阿克沙伊