ARC双向关系

时间:2014-02-12 19:42:04

标签: ios objective-c cocoa automatic-ref-counting

所以我希望有多个连接的节点。每个节点都有传出和传入连接。但是虽然我使用ARC,但NSMutableArrays正在创建泄漏。如何才能正确释放对象?我已经在使用autoreleasepool了。 sketch

目前的代码是:

@interface TestObj()
@property(strong) NSMutableArray *incoming;
@property(strong) NSMutableArray *outgoing;
@end

@implementation TestObj
@synthesize incoming,outgoing;

- (id)init
{
    self = [super init];
    if (self) {
        incoming = [NSMutableArray array];
        outgoing = [NSMutableArray array];
    }
    return self;
}

-(void)addIncoming:(TestObj *)incomingN {
    if([incoming indexOfObject:incomingN] == NSNotFound) {
        [incoming addObject:incomingN];
        [incomingN addOutgoing:self];
    }
}

-(void)addOutgoing:(TestObj *)outgoingN {
    if([outgoing indexOfObject:outgoingN] == NSNotFound) {
        [outgoing addObject:outgoingN];
        [outgoingN addIncoming:self];
    }
}

2 个答案:

答案 0 :(得分:3)

使用ARC,与iOS上的手动内存管理一样,您需要避免保留周期。如果你有一个保留第二个的对象,而第二个保留第一个,那么即使没有其他任何东西引用它们,这两个也永远不会被释放,所以你有内存泄漏。

你需要这样做,这样你才不会像这样引用它们。 NSArrayNSMutableArray保留对其他对象的强引用。您可以执行以下操作来创建可以在数组中编写故事的弱引用:

NSValue *val = [NSValue valueWithNonretainedObject:object];

如果在数组中存储val,它将没有对该对象的强引用,因此可以取消分配。但是,您必须要小心,您不会创建某些对象没有强引用的情况,或者在您希望它们之前将其取消分配。

答案 1 :(得分:0)

这可能听起来很基本,但是尝试将它们设置为nil