2012-05-28 50 views
2

我有一个对象Person和协议PersonDelegate
Person具有@property (assign) id<PersonDelegate> delegate;目标C - 调用方法的dealloc上委托

的地方在我的代码我做的:

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

这是因为委托已dealloc的?人怎么知道他的代表是dealloc?

回答

1

你的委托属性未设置保留所以它会只要你做[theDelegate release];

走坏通常委托将发布它尽管分配以避免循环引用。但在这种情况下,委托本身通常已经保存了它所委派的对象的引用。

即。

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

所以self.people是保留所有这些都创造了persons和那些persons都指向回self作为他们的代表

1

你是指定你的代表而不是保留它。 由于您释放委托,因此它不再在您的个人对象中有效,因为它未被其保留。

更改您的委托财产:

@property (retain) id<PersonDelegate> delegate;

不要忘记,当你的dealloc你的个人目标

+0

但通常代表被分配,它是如何工作的? – Eyal

+0

很可能是因为大多数代表都是视图控制器或持续超过对象本身的对象。在这种情况下,他明确地立即释放代表 – giorashc

1

假设你真的想assign .... :)

可以为您节省newPerson作为属性,并在委托对象发布之前将其委托设置为nil。 您可以让一个Person对象侦听一个代表正在消失的通知,并让它自己将其设置为零。

+0

但是,如果能保留它并亲自释放它,为什么还要付出一切麻烦? – giorashc

+0

我不知道,但我想可能有我无法想到的原因。为什么苹果为UIWebViewDelegate做这件事? –

+0

通常代表被分配..我认为我错过了一些东西。 – Eyal