2012-05-28 3 views
2

할당 해제의 위임에 방법을 부르는 @property (assign) id<PersonDelegate> delegate을; 내 코드에서목적 C - 내가 객체 <code>Person</code> 및 프로토콜 <code>PersonDelegate</code><br> <code>Person</code>이 가지고있는

어딘가에 내가 할 : 대리자가 이미 할당 해제 되었기 때문에이

Person *newPerson = [[Person alloc] init]; 
newPerson.delegate = theDelegate; 
... 
[theDelegate release]; // and dealloc 

... 

now Person has some new information for the delegate, so I call in Person 
[self.delegate doSomething]; 

하지만 난 EXC_BAD_ACCESS

얻고 있습니까? Person은 자신의 대리자가 dealloc임을 어떻게 알 수 있습니까?

답변

1

대리자 속성이 그래서 일반적으로 대리인 세트는 즉시 당신이 [theDelegate release];

처럼 나쁜 갈 것입니다 유지하기 위해 설정되어 있지 않은 사용자 문서 객체를 할당 해제 할 때 해제하는 것을 잊지 말아 순환 참조를 피하기 위해 할당 할 수 있습니다. 그러나이 경우 대리자 자체는 일반적으로 이미 위임 한 개체에 대한 참조를 유지합니다.

즉.

Person *newPerson = [[Person alloc] init]; 
[self.people addObject:newPerson]; 
newPerson.delegate = self; 
[newPerson release]; 

그래서 self.people 당신이 정말로 assign을 원하는 .... :)

당신은 절약 할 수있다 가정하면 자신의 대표

1

대신에을 할당하면 이됩니다. 대리인을 해제 했으므로 대리인이 보유하지 않았으므로 더 이상 대리인 개체에서 유효하지 않습니다.

는 귀하의 위임 속성 변경

:

@property (retain) id<PersonDelegate> delegate을;

하고

+0

대개 대리인이 지정됩니다. 어떻게 작동합니까? – Eyal

+0

아마도 대부분의 대리자는 뷰 컨트롤러이거나 개체 자체보다 더 오래 지속되는 개체이기 때문입니다. 이 경우 그는 즉시 대리인을 해제합니다. – giorashc

1

self 다시 모든 생성 된 personspersons 모든 포인트를 유지하다 newPerson을 속성으로 사용하고 대리자 개체가 해제되기 전에 해당 대리인을 nil로 설정합니다. Person 객체가 델리게이트가 없어지고 그 자체로 nil로 설정되었다는 통지를 수신 할 수 있습니다.

+0

하지만 계속 유지하고 개인 dealloc에서 해제 할 수있을 때 모든 문제가 발생합니까? – giorashc

+0

모르겠지만 생각할 수없는 이유가 있다고 생각합니다. 왜 애플은 UIWebViewDelegate를 위해 그것을합니까? –

+0

대개 대리인이 할당됩니다 .. 뭔가를 놓치고있는 것 같아요. – Eyal