2012-05-28 47 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