2009-08-24 3 views
1

와 객체를 해제 : cellForRowAtIndexPath는 : 목표 C 누출 내가있는 tableView에 다음 코드를 실행하고있는 UITableViewCell

File *file = [[File alloc] init]; 
file = [self.fileList objectAtIndex:row]; 
UIImage* theImage = file.fileIconImage; 

cell.imageView.image = theImage; 
cell.textLabel.text = file.fileName; 
cell.detailTextLabel.text = file.fileModificationDate; 
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 

return cell; 

나는 누수 도구를 실행하고 나는 그것을 공개하고 있지 않다 때문에 File 객체가 누출되는 것을 발견했다. (아래 그림 참조) 나는 그것이 안전하다고 생각 어디 그래서 이전 셀을 반환에 자료를 추가 :

File *file = [[File alloc] init]; 
file = [self.fileList objectAtIndex:row]; 

UIImage* theImage = file.fileIconImage; 

cell.imageView.image = theImage; 
cell.textLabel.text = file.fileName; 
cell.detailTextLabel.text = file.fileModificationDate; 
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
[file release]; 

return cell; 

을 지금, 나는 그것이 충돌 응용 프로그램을 실행할 때. UITableViewCells가 여전히 파일 객체를 참조합니까? 내가 메모리를 누출하지 않도록 여기에서 사용하는 접근법은 무엇입니까?

답변

6
File *file = [[File alloc] init]; 
file = [self.fileList objectAtIndex:row]; 

음, 여기 먼저 새 File을 할당하고 다음이 배열에서 기존의 다른 개체를 얻을 분명히 포인터를 버리고. 나중에 release으로 전화하면 그 중 하나가 해제됩니다. 결국 release으로 전화 한 사람이 귀하가 할당 한 사람이 아닙니다. 새롭게 할당 된 포인터는 잃어 버려서 유출된다.

아마도 self.fileList에 이미 파괴 된 개체에 대한 포인터가 포함되어 있기 때문에 충돌이 발생했을 가능성이 큽니다.

이 어쩌면 당신은 단지

File *file = [self.fileList objectAtIndex:row]; 
+0

페어를 작성하는 것을 의미, 그 비트에보고하지 않았다/초기화 ALLOC를 가진 오토 릴리즈를 제안 만했다 ...하지만, 그는 바로 필요로하지 않는 것 파일 객체를 할당/초기화하는 것! – h4xxr

1

예, 셀은 출시 시점에서 계속 참조하므로 앱이 다운됩니다.

File *file = [[[File alloc] init] autorelease]; 

를 그런 다음 [파일 자료] 부분을 호출하지 않는 : 당신이 그것을 선언 할 때 다음과 같이

당신은, 오토 릴리즈를 사용해야합니다. 더 이상 참조되지 않으면 (즉, 셀 사용을 중단하면) 다음 실행 루프가 시작될 때 자동으로 실행됩니다.

관련 문제