51 lines
1.1 KiB
Objective-C
51 lines
1.1 KiB
Objective-C
// 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
|