处理NSArray(默认情况下保留对象)时如何避免保留周期?

时间:2011-08-24 03:32:43

标签: objective-c memory-management memory-leaks retain

我的情况是我有两个类:“人”和“组”。 在每个人中,它都有一个NSArray,可以恢复它所属的每个组。 在每个群体中,它都有一个NSAraay,可以恢复属于它的每个人。

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

这是一种保留计数我认为,一个人保留了一个NSArray,它保留了一个保留NSArray的集团,该集团保留给该人。

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

我该如何解决这个问题?

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

3 个答案:

答案 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,

阿克沙伊