2014-02-12 117 views
0

所以我想要有多個連接的節點。每個節點都有傳出和傳入連接。但NSMutableArrays創建泄漏,雖然我使用ARC。我怎樣才能得到正確釋放的對象?我已經在使用autoreleasepool了。 sketchARC雙向關係

到目前爲止的代碼是:

@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]; 
    } 
} 

回答

3

使用ARC,與iOS上的手動內存管理一樣,您需要避免保留週期。如果你有一個對象保留第二個,第二個保留第一個,那麼即使沒有其他引用它們,這兩個也不會被釋放,所以你有內存泄漏。

你需要讓它不會像這樣引用它們。 NSArrayNSMutableArray保留對其他對象的強引用。你可以不喜歡下面創建一個弱引用,你可以的故事在陣列中:

NSValue *val = [NSValue valueWithNonretainedObject:object]; 

如果存儲val數組中,它不會有很強的參考對象,因此它可以被釋放。但是,您必須小心,您不會創建一些您的對象沒有強引用的情況,否則它們會在您需要之前被釋放。

+1

很好的答案。另外:由於您知道有關保留週期,因此您可以通過稍後移除強引用來解決問題(例如,通過從陣列中移除對象)。 –

+0

我曾嘗試調用removeAllObjects,但它不起作用。 – thomasguenzel

0

嗯,這聽起來簡單,但是試圖將它們設置=到nil

+0

我有,但它沒有工作:/ – thomasguenzel