2014-02-12 1 views
0

그래서 여러 노드가 연결되기를 원합니다. 모든 노드에는 나가는 연결과 들어오는 연결이 있습니다. 하지만 ARC를 사용하고 있지만 NSMutableArrays는 누출을 생성합니다. 어떻게하면 개체를 제대로 출시 할 수 있습니까? 이미 자동 복구 풀을 사용하고 있습니다. 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

iOS의 수동 메모리 관리와 마찬가지로 ARC를 사용하면 유지주기가 필요하지 않습니다. 잠시 동안 유지하고있는 객체가 하나 있고 두 번째 객체가 첫 번째 객체를 보유하고 있다면 그 중 아무 객체도 참조하지 않아도이 두 객체가 절대 할당 해제되지 않으므로 메모리 누수가 발생합니다.

이와 같이 참조하지 않도록해야합니다. NSArrayNSMutableArray은 다른 개체에 대한 강력한 참조를 유지합니다. 당신이 배열에 val를 저장하는 경우

NSValue *val = [NSValue valueWithNonretainedObject:object]; 

, 그것은 개체에 대한 강한 참조가되지 않습니다, 그래서 할 수 있습니다 당신은 당신이 배열의 이야기를 할 수있는 약한 참조를 만들려면 다음과 같이 뭔가를 할 수 할당 해제된다. 그러나 일부 개체에 강력한 참조가없는 상황을 만들지 않도록주의해야합니다. 그렇지 않으면 개체를 원하기 전에 할당이 해제됩니다.

+1

좋은 답변입니다. 한 가지 추가 사항 : 보존주기에 대해 알고 있기 때문에 나중에 (예 : 배열에서 객체를 제거하여) 강력한 참조를 제거하여 문제를 해결할 수 있습니다. –

+0

removeAllObjects를 호출하려고했지만 작동하지 않았습니다. – thomasguenzel

0

음이 기본 들릴지 모르지만, nil에 =을 설정 시도?

+0

작동하지 않았습니다./ – thomasguenzel