다음 메소드는 끝에서 빈 페이지의 저널을 정리하는 데 사용됩니다.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 분석기에서도이를 볼 수 있습니다.
이 코드가 유출 되었습니까? 그렇지 않다면, 왜?
페이지 자체가 어딘가에서 과도하게 공개 될 수 있습니까? 기본적으로 self.pages에서 제거하면 기본적으로 파기됩니다. pagesToRemove가 출시되면 추가 릴리스 메시지가 발생하고 충돌이 발생합니다. 그것은 여기에 제시된 것에 전적으로 근거한 나의 추측 일 것입니다. 따라서 페이지 객체를 어떻게 생성하는지 살펴보십시오. –