Должен ли я иметь возможность настроить наблюдателя на прокси-объекте, изменить то, на что указывает прокси-объект, и при этом иметь возможность наблюдать изменения на реальном объекте?
Пример может объяснить это лучше всего. Подумайте о следующем.
В шапке:
@interface MyController : NSObject {
MyWidgetModel * aProxyObject;
}
При инициализации или пробуждении из метода NIB:
-(void)awakeFromNib {
// Init the proxy object. Could be as an empty widget
[aProxyObject addObserver:self
forKeyPath:@"widgetName"
options:NSKeyValueObservingOptionNew
context:nil];
}
Какой-то другой метод, который изменяет объект:
-(void)changeWidget:(MyWidgetModel *)aNewWidget {
aProxyObject = aNewWidget;
}
Это не вызывает никаких изменений в aNewWidget
. Однако, если я переместу addObserver
после назначения следующим образом, это сработает:
-(void)changeWidget:(MyWidgetModel *)aNewWidget {
[aProxyObject removeObserver:self forKeyPath:@"widgetName"];
aProxyObject = aNewWidget;
[aProxyObject addObserver:self
forKeyPath:@"widgetName"
options:NSKeyValueObservingOptionNew
context:nil];
}
Я предполагаю, что первый случай не работает, потому что наблюдатель наблюдает указатель памяти ссылки на прокси-объект, и, поскольку в момент добавления прокси-наблюдателя нет объекта, ему нечего наблюдать. Однако, если я инициализирую виджет и наблюдаю за этим, затем назначаю прокси-объект aNewWidget
, он все равно не наблюдает изменений, пока я не добавлю наблюдателя после назначения (и, конечно, создаю необходимость удалить наблюдателя при изменении объекта ).
Кроме того, что произойдет в этом сценарии, если aNewWidget
будет уничтожен? Поскольку наблюдатель находится на прокси-сервере, отменяет ли это необходимость удаления наблюдателя перед уничтожением объекта? (Полагаю, что нет).
В идеале я хотел бы иметь возможность установить наблюдателя на прокси-сервер и поменять местами любую ссылку на виджет, которую я хочу, на объект прокси, не беспокоясь о добавлении и удалении наблюдателя, если класс MyController
не исчезнет в этом случае я мог бы справиться с удалением наблюдателя в dealloc.
Любая помощь / комментарии / советы приветствуются.