| // Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| #include "observer.h" | |
| #import <objc/runtime.h> | |
| #if !__has_feature(objc_arc) | |
| #error "This file must be compiled with ARC enabled" | |
| #endif | |
| @implementation DOBJCObservation { | |
| id _object; | |
| id<Observer> _observer; | |
| NSString* _keyPath; | |
| void* _context; | |
| } | |
| - (instancetype)initForKeyPath:(NSString*)keyPath | |
| ofObject:(id)object | |
| withObserver:(id<Observer>)observer | |
| options:(NSKeyValueObservingOptions) options | |
| context:(void *)context { | |
| _object = object; | |
| _observer = observer; | |
| _keyPath = keyPath; | |
| _context = context; | |
| [object addObserver: observer | |
| forKeyPath: keyPath | |
| options: options | |
| context: context]; | |
| return self; | |
| } | |
| - (void)remove { | |
| @synchronized(self) { | |
| [_object removeObserver:_observer forKeyPath:_keyPath context:_context]; | |
| _object = nil; | |
| _observer = nil; | |
| _keyPath = nil; | |
| } | |
| } | |
| - (void)dealloc { | |
| [self remove]; | |
| } | |
| - (void*)debugObserver { return (__bridge void*)_observer; } | |
| @end |