2012-05-28 6 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];

Обычно делегатом является набора назначить хотя бы, чтобы избежать круговой ссылки. Но в этом случае сам делегат обычно уже ссылается на объект, которому он делегирован.

ie.

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

Так self.people является сохранение всех persons, которые созданы и тех persons всех точек обратно self как их делегат

1

Вы являетесь , назначая своим делегатом вместо , сохраняя. Поскольку вы освобождаете делегата, он больше не действует в вашем объекте person, так как он не был сохранен им.

Изменение делегата собственности:

@property (retain) id<PersonDelegate> delegate;

и не забудьте освободить его, когда вы dealloc вашего объект человека

+0

но обычно делегаты назначаются, как это работает? – Eyal

+0

, вероятно, потому, что большинство делегатов - это контроллеры представлений или объекты, которые больше, чем сам объект. В этом случае он ясно освобождает делегата сразу – giorashc

1

Предполагая, что вы действительно хотите assign .... :)

Вы можете сохранить newPerson как свойство и установите его делегат в ноль до того, как будет выпущен объект делегата. У вас может быть объект Person для прослушивания уведомления о том, что делегат уходит, и он сам установил его на ноль.

+0

Но почему все проблемы возникают, когда вы можете сохранить его и освободить его в dealloc человека? – giorashc

+0

Я не знаю, но я полагаю, что могут быть причины, о которых я не могу думать. Почему Apple делает это для UIWebViewDelegate? –

+0

Обычно делегаты назначаются .. Я думаю, что я что-то упустил. – Eyal

Смежные вопросы