2010-11-28 3 views
1

(또는 하나의 델리게이트가있는 단 하나의 클래스)동일한 델리게이트를 가진 여러 클래스를 해제하는 방법은 무엇입니까?

나는 웹에서 파일을 다운로드하는 DataGetter라는 클래스가 있다고합니다.

- (void) dataGetterFinished:(DataGetter *)dataGetter; 
그래서 somehere 내가 여러 개의 파일을 설정할 수 있습니다 내 코드에서

은과 같이 다운로드 할 :

// in AViewController.m 
DataGetter *blueFile = [[DataGetter alloc] init]; 
blueFile.delegate = self; 
[blueFile getData:@"http://example.com/blue-file"]; 

DataGetter *redFile = [[DataGetter alloc] init]; 
redFile.delegate = self; 
[redFile getData:@"http://example.com/red-file"]; 

정적 연타를 사용하여 파일이 다운로드 된 때 트리거됩니다 대리자 방법을 가지고 있습니다 분석기에서 위의 각 할당 행은 '행에 할당 된 객체의 잠재적 누설 ...'오류를 가져옵니다. 그렇다면 어떻게 객체를 릴리즈할까요? 그것은 대의원이 있기 때문에 주변에 매달려있다. 그래서 그렇게

- (void) dataGetterFinished:(DataGetter *)dataGetter 
{ 
// code 
[dateGetter release]; 
} 

처럼 dataGetterFinished 방법의 마지막 줄을 해제 OK입니다 ... 또는 어떻게 든 오토 릴리즈를 사용 하는가?

답변

1

기술적으로는 제대로 작동하지만 NSMutableArray에서 다른 DataGetters를 추적하는 것이 좋습니다.

DataGetter *blueFile = [[DataGetter alloc] init]; 
blueFile.delegate = self; 
[blueFile getData:@"http://example.com/blue-file"]; 
[dataGetters addObject:blueFile]; // dataGetters is an NSMutableArray declared in the .h 
[blueFile release]; 

// Same for red 

그런 다음 대의원 방법, 간단한 배열에서 게터를 제거 : 예를 들어

- (void) dataGetterFinished:(DataGetter *)dataGetter 
{ 
// code 
[dataGetters removeObject:dataGetter]; 
} 

배열 개체를 유지을 담당, 당신은하지 않습니다 분석 경고.

dealloc 메소드에서 dataGetters를 릴리스하십시오.

+0

감사합니다. 델리게이트 메서드에서 클래스를 공개하는 것보다 NSMutableArray를 사용하면 어떤 이점이 있습니까? 그것은 단순히 clang 신을 기쁘게하는 것입니까? – cannyboy

+1

네, 그렇게 말할 것입니다. 나중에 데이터 겟터에 액세스하려는 경우 배열을 살펴볼 수 있습니다. 나는 항상 그것을하기의 훨씬 더 tidier 방법 느꼈다. –

관련 문제