2009-09-06 6 views
1

안녕하세요, 내 수업을 초기화하기위한 코드가 있습니다. 난인스트루먼트는 메모리 누수를 지적합니다!

- (id)initWithSize:(int)size { 

    self = [super init]; 

    if(self != nil) 
    { 
     [self setMyVector:[[NSMutableArray alloc] initWithCapacity:size]]; 

     for (int i = 0; i < size; i++) 
     { 
      [myVector addObject: [[NSMutableArray alloc] initWithCapacity:size]]; 
     } 
    } 

    return self; 
} 

는 악기에서이 누출을 얻을!
카테고리 : CFArray (매장 양단 큐)
이벤트 유형 : malloc에 ​​

누군가가 내가 그것을 해결하기 위해 필요한 게 뭔지 알아요? 감사합니다.

+0

'if (self! = nil)'을'if (self)'로 대체 할 수 있습니다. –

답변

6

누출은 for 루프에 있고 누유는 전에도있을 수 있습니다.

첫째,이 라인 : setMyVector이 (, 아마해야 규칙에 따라하는), 다음 배열을 유출 한 전달 된 배열을 유지

[self setMyVector:[[NSMutableArray alloc] initWithCapacity:size]];

합니다. 먼저 배열을 할당하고 초기화합니다. 보유 수는 +1입니다. 그런 다음 myVector 인스턴스 변수에 설정합니다. 즉, 보유 수는 +2입니다. myVector에 다른 것을 넣거나 dealloc 메소드에서 myVector 변수를 해제하면 보유 수를 감소시켜 +1 보유 수를 갖게됩니다. 즉, 할당이 해제되지 않고 배열이 유출되었습니다. 그런 다음에 추가

다시

[myVector addObject: [[NSMutableArray alloc] initWithCapacity:size]];

, 당신은 하나의 유지 수를 배열을 만들 :

다른, 확실한 누수가있는 당신을 위해() 루프, 내부 다시 보관할 myVector 배열입니다 (+2). 그러나 더 이상 배열에 대한 포인터가 없어서 유출되었습니다.

alloc/init 방식 대신 [NSMutableArray arrayWithCapacity:size]을 사용하면이 두 가지 누출을 모두 해결할 수 있습니다. 자동 누출 어레이가 생성되어 메모리 누수가 해결됩니다.

자동 회수가 무엇인지 모르는 경우 배열을 생성하여 로컬 변수에 저장하거나 myVector에 추가하거나 myVector에 설정 한 다음 나중에 즉시 해제 할 수 있습니다.

+0

정말 고마워요, 잘 했어! – Hitcurst

관련 문제