2011-11-02 2 views
5

iOS 앱을 작성하고 imageStore 라이브러리를 사용하여 이미지를 지연로드하고 메모리에 캐시합니다.iOS 호출 방법 앞에 대리자가 있는지 확인하십시오.

imageStore = [ImageStore new]; 
imageStore.delegate = self; 

이미지가 reloadData을하고 있음을

- (void)imageStoreDidGetNewImage:(ImageStore*)sender url:(NSString*)url 

imagestore 통화 위임 방법, successfuly로드 할 때 : (https://github.com/psychs/imagestore)는

의 ViewController에

나는 imagestore 인스턴스를 생성 tableview에서 셀을 다시 그리기. 모두 잘 작동합니다. 하지만 거기에 문제가 : ViewController didUnload (네비게이션 컨트롤러로 돌아 가기) 및 이미지가로드 된 경우, 응용 프로그램이 무인 ViewController의 imagestore 메서드를 호출하기 때문에 충돌로 종료됩니다.

내가 다음을 수행하십시오 : 1)의 ViewController에서 나는 viewDidUnload 섹션에서이 코드를 배치 :

imageStore.delegate = nil; 
imageStore = nil; 

2) imageStore에서 내가 전무 검사 추가 된 : 그것은 작동

if(delegate != nil) { 
    ...call delegate method 
} 

을, 어쨌든 정기적으로 앱이 다운됩니다.

+0

'2)'는 불필요합니다. 메시지는'nil' 객체에 안전하게 보낼 수 있습니다. – Nekto

+0

답변 해 주셔서 감사합니다! 이미지로드 및 viewcontroller 언로드 경우 충돌없이 100 % ... –

답변

12

이 코드를 dealloc 섹션에 넣으십시오. 같은 방법으로

imageStore.delegate = nil; 
imageStore = nil; 

은 An 전무 객체에 대한 호출이 응용 프로그램에 의해 무시, 그래서 당신은 이런 일이 있으면되기 때문에 절은 필요하지 않은 경우 :

id delegate = nil;  
[delegate callAnyMethod]; 

가에 영향을주지 않습니다 당신의 응용 프로그램 동작은, 다른 손에 방법 대리자의 호출이 그 대리인이 선택에 응답 슈어해야 선택 사항 인 경우,이 같은 트릭을 수행해야합니다

if([delegate conformsToProtocol:@protocol(yourProtocolName)] && [delegate respondsToSelector:@selector(imageStoreDidGetNewImage:url:)]) { 
     [delegate imageStoreDidGetNewImage:imageStore url:url]; 
} 

건배!

0

어쨌든 작동하지만 정기적으로 앱이 다운됩니다.

그건 모순입니다. 두 가지 가능성이 있습니다.

  1. 수정 사항이 적용되었으며 다른 이유로 응용 프로그램이 충돌합니다.

  2. 수정 프로그램이 작동하지 않았으며 이전과 동일한 이유로 응용 프로그램이 계속 충돌합니다.

실제로 이러한 두 가지 가능성 중 어떤 것이 발생하는지 알지 못하면 무엇이 잘못되었는지 알기가 어렵습니다. 스택 크롤과 같은 오류 메시지와 크래시의 증거를 확인하십시오. 왜 앱이 충돌하나요? 먼저 확인하지 않고 delegate 속성을 어딘가에 역 참조하려고합니까? 델리게이트가 무언가를하는 것에 따라 달라 지므로, 델리게이트가 더 이상 존재하지 않는다면 그 일은 끝나지 않고 결국에는 충돌로 이어질 수 있습니까? 이것들은 제가 찾는 것입니다.하지만 가장 중요한 것은 당신이 가지고있는 증거로 시작하여 코를 따르는 것입니다.

관련 문제