2011-01-20 4 views
0

다음 메소드는 끝에서 빈 페이지의 저널을 정리하는 데 사용됩니다.NSMutableArray, removeFromArray 및 release, 왜이 충돌이 발생합니까?

// self.pages property declaratioN, this is on the header 
@property(nonatomic, retain) NSMutableArray *pages; 

// method that crashes 
- (void)cleanup { 

    NSMutableArray *pagesToRemove = [[NSMutableArray alloc] init]; 
    for (int n = [self.pages count]-1; n >= 0; n--) { 
     JournalPage *page = [self.pages objectAtIndex:n]; 
     if (![page isEmpty]) { 
      break; 
     } else { 
      if (([self.pages count] - ([pagesToRemove count] + 1) > 2)) { 
       [pagesToRemove addObject:page]; 
      } else { 
       break; 
      }    
     } 

    } 

    if ([pagesToRemove count] % 2 != 0) { 
     [pagesToRemove removeLastObject]; 
    } 
    [self.pages removeObjectsInArray:pagesToRemove]; 
    [pagesToRemove release]; // this line makes the app crash 
}  

pagesToRemove을 해제하면 충돌이 발생합니다. [pageToRemove release]을 제거하고 NSMutableArray 인스턴스를 할당/할당 할 때 대신 autorelease를 사용하면 충돌이 발생합니다.

코드가 작동하지 않지만 pageToRemove은 공개되지 않지만 누수가 표시되며 clang 분석기에서도이를 볼 수 있습니다.
이 코드가 유출 되었습니까? 그렇지 않다면, 왜?

+1

페이지 자체가 어딘가에서 과도하게 공개 될 수 있습니까? 기본적으로 self.pages에서 제거하면 기본적으로 파기됩니다. pagesToRemove가 출시되면 추가 릴리스 메시지가 발생하고 충돌이 발생합니다. 그것은 여기에 제시된 것에 전적으로 근거한 나의 추측 일 것입니다. 따라서 페이지 객체를 어떻게 생성하는지 살펴보십시오. –

답변

0

당신 걸치고에 오타가있다 : 그것은 pageToRemove하지 페이지 ToRemove 말한다

[pageToRemove release]; // this line makes the app crash 

하는 것으로. ;)

+0

당신 말이 맞아요, 불행히도 제가 여기에 오타가있어 스택 오버 플로우에 대한 코드를 다시 작성했습니다. 아무리해도 충돌이 발생합니다. 하지만 고마워, 이제 버그 수정을 위해 편집 중입니다. – nutsmuggler

관련 문제