处理NSArray时如何避免retain循环(默认保留对象)?

问题描述 投票:0回答:3

我的情况是我有两个班级:“人”和“组”。 每个人都有一个 NSArray 来恢复它所属的每个组。 在每个组中,它都有一个 NSAraay,可以恢复每个人属于它的身份。

一个人可以属于多个群组,一个群组可以有很多人属于它。

我认为这是一种保留计数,一个人保留一个 NSArray,该 NSArray 保留该组,该组保留一个 NSArray,该组保留回该人。

但我认为我确实需要每个人都知道它属于哪个组,并且每个组都知道这些人属于它。

我该如何解决这个问题?

我认为 NSArray 不会保留所有会破坏循环的成员,但显然 NSArray 必须保留它们。所以请提供一些建议。

objective-c memory-management memory-leaks retain
3个回答
2
投票

您可以使用

[NSValue valueWithNonretainedObject:...]
将对象放入数组中而不保留它们。我不确定这是否是“最好”的解决方案,但它会起作用。


0
投票

@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
投票

如果这不是真的,我想到的一个简单的解决方案是存储间接引用而不是直接引用。例如,每个人或每个组都应该有一个 ID(假设它是一个

NSString

)。然后,每个 Person 类将存储一个

NSString
数组(与其所属组对应的组 ID),每个 Group 类将存储一个
NSString
数组(与其成员对应的人员 ID)。这样,您将需要维护一个 Map/Dictionary 结构,用于存储像
<personOrGroupID, PersonOrGroupObject>
这样的对并在该结构中查找 ID。
    

© www.soinside.com 2019 - 2024. All rights reserved.