I have a pretty standard case and for the sake of simplicity, assume there's MyController and its MyModel. Heres's an excerpt of MyModel:
@interface MyModel
@property (nonatomic, weak) id<ModelObserver> *delegate;
@end
@implementation MyModel
- (id)initWithDelegate:(id<ModelObserver>)delegate
{
self = [super init];
if (self) {
_delegate = delegate;
// Adds observer for model load and changes
[self addObserver:_delegate];
...
}
- (void)dealloc
{
// Remove delegates and progress indicator
[self removeObserver:_delegate];
@end
Here's an excerpt of MyController
@interface MyController
@property (nonatomic, strong) MyModel *_myModel;
@end
@implementation MyController
- (void)commonInit
{
_myModel = [[MyModel alloc] initWithDelegate:self];
}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
[self commonInit];
}
return self;
}
@end
MyModel has a delegate of type id (pointing to MyController). MyController has strong ivar _myModel. MyController creates model and passes himself as a delegate upon alloc. MyModel extends MyBaseModel, and a delegate (MyController) is added to observer list and gets notified about list model changes. The problem is, observer MyController gets deallocated before [self removeObserver:_delegate]; is able to remove it from observer list, so I'm getting crash sometimes later.
Already did debugging, and when execution stops on "[self removeObserver:_delegate];" The MyController still exists (po _delegate prints out object). However, _delegate is nil right after stepping into [self removeObserver:_delegate], I mean param is nil from inside.
UPDATE If I do "po _delegate" in dealloc I can see object, so it's not nil. But as soon as code enters [self removeObserver:_delegate] it's nil inside, so it's not passed as an argument to "removeObserver:". HOWEVER, when I return from "removeObserver:" to dealloc when debugging, _delegate is not nil again.