2010-04-27 3 views
2

델리게이트를 유지하지 않고 두 클래스간에 델리게이트 콜백 패턴을 구현했습니다. 그러나 어떤 경우에는 대리자가 할당 취소됩니다. dealloced 대리자에 대한 콜백을 처리 할 때?

는 (내 경우에는 내가의 ViewController 대리자 개체입니다, 그리고 있다는 점이다 사용자 다시 눌러 버튼의 ViewController가있는 navigationController 스택에서 POP를하는 경우)

그런 다음 콜백 방법은 BAD_EXE 얻을 :

if (self.delegate != nil && [self.delegate respondsToSelector:selector]) { 
    [self.delegate performSelector:selector withObject:self withObject:returnObject]; 
} 

델리게이트 콜백 패턴이 많은 애플리케이션에서 구현된다는 것을 알고 있습니다. 이것에 대한 당신의 해결책은 무엇입니까?

+0

누군가는 할당 해제 된 객체 인스턴스를 테스트 할 수 없다고 말했습니다. http://stackoverflow.com/questions/983333/objective-c-test-for-object-instance-being-dealloced-freed – KONG

답변

2

일반적으로 대리인은 dealloc 메서드에서 위임 개체와 항상 연결을 끊어야합니다. 따라서보기 컨트롤러는 위임 클래스의 위임자로 설정되어 있는지 여부를 dealloc에서 확인해야하며, 그렇다면 위임 속성을 nil으로 설정해야합니다.

대개의 경우 대리인이 위임하는 개체의 유일한 소유자이기 때문에 대부분 문제가되지 않는다고 생각합니다. 따라서 델리게이트가 할당 해제되면 위임 객체 역시 할당 해제됩니다. 결국 위임하는 개체는 대개 약한 참조 만 자신의 대리자에 보유하게됩니다.

+0

시도했습니다. NSURLConnection이 델리게이트 - 콜백을 구현하는 방식을 따르십시오. 이 메서드를 사용하면 위임 객체를 유지할 필요가 없습니다. ClassA : 네트워크 클래스 초기화, 작업 수행 수행 NetworkClass * networkObject = [[NetworkClass alloc] init]; [networkObject getSomethingWithDelegate : self]; callbacking, NetworkClass는를 ClassA 에 해제 그것 자체를 통과 - (무효) networkClass (NetworkClass *) networkObject didGetSomething : returnObject [networkObject 해제]로 할 // (NSObject의 *) returnObject { 단계; networkObject = nil; } 하지만 당신이 말한 것처럼 이것을 변경해야 할 수도 있습니다. – KONG

+0

위임 개체를 릴리스 할 때 위임 개체를 릴리스하려고합니다. 그러나 일부 라이브러리 (예 : MGTwitterEngine, NSURLConnection)에서 위임하는 개체는 자체적으로 유지되며 위임하는 개체를 릴리스 할 수 없습니다. 너는 어떤 생각을 가지고 있니? – KONG

+0

나는 delegate 속성을 nil (어떤 상황에서는)으로 설정해야한다고 말했고, 어떤 것도 공개해서는 안된다. 자신이 소유하지 않은 오브젝트는 절대로 공개하지 않아야합니다. 나는 솔직히 당신의 질문을 이해하지 못합니다. –

0

나는 객관적인-C에 대한 지식이없는,하지만 난 당신이 별도로 예컨대

if (self.delegate != nil) 
{ 
if ([self.delegate respondsToSelector:selector]) 
{ 
    [self.delegate performSelector:selector withObject:self withObject:returnObject]; 
} 
} 

self.delegate != nil을 테스트 할 필요가 있다고 생각하고 그것이 전무 인 경우 대리자를 할당하는 것이 가장 좋습니다.

+0

아니, 그게 도움이되지 않습니다. 'delegate' 속성은 여전히 ​​메모리 주소를 가르키지 만 그 주소에 있던 객체는 할당 해제됩니다. 델리게이트가 'nil'이면 문제가되지 않습니다. –

+0

오케이. "nil"또는 "null"값을 테스트하고 다른 값을 가질 수 있는지 확인하는 문제가 발생하기 전에 문제가 발생했는지 궁금합니다. 당신이 말한대로 나는 이것이 객관적인 문제가 아니라고 생각합니다. c. 나는 대리인이 할당 취소되었다고 OP가 말했던 것을 이해했지만, 지금은 그렇지 않다. – ChrisBD

+0

&& 확인의 첫 번째 명령문이 실패하면 두 번째 명령문은 평가되지 않습니다. – quantumpotato

관련 문제