I have ParentViewController that allocates ChildViewController, pushes it onto controller stack and releases it.
ChildViewController implements the protocol ProductDownloadDelegateProtocol required by the Product class.
At some point, ChildViewController creates a Product object and sets itself as its downloadDelegate.
While downloading, Product class updates ChildViewController via methods defined in ProductDownloadDelegateProtocol.
If the user presses the back button in the navBar of ChildViewController while downloading, the next update of download percentage from Product causes an EXC_BAD_ACCESS.
Although Product checks if downloadDelegate is nil, problem still occurs since ChildViewController/downloadDelegate is deallocated, but not set as nil. I don’t know which point is best to set ChildViewController to nil.
Is my design wrong?
If your
ChildViewControllercreates an instance ofProductand sets itself as the delegate, it should be its responsibility to remove itself as the delegate when it’s about to be unloaded. Either in it’sviewDidUnloadordeallocmethod you should be setting theProductdelegate to nil.If
ChildViewControllerstays around (say you are reusing the view controller), maybe you can remove it as the delegate in theviewWillDissappearmethod.Another solution to fix this particular EXC_BAD_ACCESS issue is to move to ARC and use Zeroing Weak References (see a good writeup here, http://www.mikeash.com/pyblog/friday-qa-2010-07-16-zeroing-weak-references-in-objective-c.html).
Still, I would recommend you move to ARC for the right reasons, and not to fix this particular issue you are facing.