Я думаю, что в этом случае вам следует учитывать сообщение статического анализатора. У вашей модели есть потенциальные проблемы.
В частности, когда вы возвращаетесь из метода, вызванного для выполнения шага 5, вы находитесь в методе объекта, который, возможно, уже был освобожден. Я интерпретирую ваш шаблон примерно так:
// steps 1, 2, 3
-(void) methodThatCreatesObject
{
id theObj = [[TheObj alloc] init];
[theObj setDelegate: delegateObj];
// other stuff
}
Обратите внимание, что вышеприведенные нарушения правил управления памятью
// step 4 - a method of theObj
-(void) someMethod
{
[delegate notifyTaskCompleteFromObj: self];
// self points to an invalid object here. Doing anything with self results in EXC_BAD_ACCESS
}
Вышеупомянутое нарушает предположение, изложенное в правилах управления памятью:
Полученный объект обычно гарантированно остается действительным в методе, который был получен в
, если мы говорим self
- это полученный объект, которым он является технически, поскольку он передается в качестве параметра в стеке.
// step 5 the delegate method defined in the delegate object
-(void) notifyTaskCompleteFromObj: (TheObj*) anObj
{
// do stuff
[anObj release];
}
Вышеуказанное также нарушает правила управления памятью.
Обычный шаблон - иметь контроллер, которому принадлежит и делегат, и объект, который имеет делегата (часто контроллер сам является делегатом). Я думаю, что вы должны перейти к этому шаблону.