我的情况是我有两个班级:“人”和“组”。 每个人都有一个 NSArray 来恢复它所属的每个组。 在每个组中,它都有一个 NSAraay,可以恢复每个人属于它的身份。
一个人可以属于多个群组,一个群组可以有很多人属于它。
我认为这是一种保留计数,一个人保留一个 NSArray,该 NSArray 保留该组,该组保留一个 NSArray,该组保留回该人。
但我认为我确实需要每个人都知道它属于哪个组,并且每个组都知道这些人属于它。
我该如何解决这个问题?
我认为 NSArray 不会保留所有会破坏循环的成员,但显然 NSArray 必须保留它们。所以请提供一些建议。
[NSValue valueWithNonretainedObject:...]
将对象放入数组中而不保留它们。我不确定这是否是“最好”的解决方案,但它会起作用。
@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
对于您的具体情况,我会退后一步,看看是否有更好的方法来构建您的类以完全规避这个问题。
如果这不是真的,我想到的一个简单的解决方案是存储间接引用而不是直接引用。例如,每个人或每个组都应该有一个 ID(假设它是一个
NSString
)。然后,每个 Person 类将存储一个
NSString
数组(与其所属组对应的组 ID),每个 Group 类将存储一个 NSString
数组(与其成员对应的人员 ID)。这样,您将需要维护一个 Map/Dictionary 结构,用于存储像 <personOrGroupID, PersonOrGroupObject>
这样的对并在该结构中查找 ID。