Класс NativeFinalizer
Нативный финализатор, который можно прикрепить к объектам Dart.
Когда финализатор прикреплён к объекту Dart, его нативный обратный вызов вызывается после того, как объект Dart собран сборщиком мусора или становится недоступным по другим причинам.
Обратные вызовы будут происходить как можно раньше, когда объект станет недоступным для программы, и могут произойти в любой момент во время выполнения программы. В крайнем случае, когда группа изолятов завершается, гарантируется вызов этого обратного вызова для каждого объекта в этой группе изолятов, к которому по-прежнему прикреплён финализатор.
По сравнению с Finalizer из dart:core, который не обещает вызывать прикреплённый обратный вызов, этот нативный финализатор гарантирует, что все прикреплённые финализаторы будут вызваны хотя бы один раз перед завершением программы, и обратные вызовы вызываются как можно скорее после того, как объект будет распознан как недоступный.
Когда обратный вызов является функцией Dart, а не нативной функцией, используйте Finalizer вместо этого.
Нативный финализатор можно использовать для закрытия нативных ресурсов. Смотрите пример ниже.
/// [Database] enables interacting with the native database.
///
/// After [close] is called, cannot be used to [query].
///
/// If a [Database] is garbage collected, it is automatically closed by
/// means of a native finalizer. Prefer closing manually for timely
/// release of native resources.
///
/// Note this class is incomplete and for illustration purposes only.
class Database implements Finalizable {
/// The native finalizer runs [_closeDatabasePointer] on [_nativeDatabase]
/// if the object is garbage collected.
///
/// Keeps the finalizer itself reachable, otherwise it might be disposed
/// before the finalizer callback gets a chance to run.
static final _finalizer =
NativeFinalizer(_nativeDatabaseBindings.closeDatabaseAddress.cast());
/// The native resource.
///
/// Should be closed exactly once with [_closeDatabase] or
/// [_closeDatabasePointer].
Pointer<_NativeDatabase> _nativeDatabase;
/// Used to prevent double close and usage after close.
bool _closed = false;
Database._(this._nativeDatabase);
/// Open a database.
factory Database.open() {
final nativeDatabase = _nativeDatabaseBindings.openDatabase();
final database = Database._(nativeDatabase);
_finalizer.attach(database, nativeDatabase.cast(), detach: database);
return database;
}
/// Closes this database.
///
/// This database cannot be used anymore after it is closed.
void close() {
if (_closed) {
return;
}
_closed = true;
_finalizer.detach(this);
_nativeDatabaseBindings.closeDatabase(_nativeDatabase);
}
/// Query the database.
///
/// The database should not have been closed.
void query() {
if (_closed) {
throw StateError('The database has been closed.');
}
// Query the database.
}
}
final _nativeDatabaseBindings = _NativeDatabaseLib(DynamicLibrary.process());
// The following classes are typically generated with `package:ffigen`.
// Use `symbol-address` to expose the address of the close function.
class _NativeDatabaseLib {
final DynamicLibrary _library;
_NativeDatabaseLib(this._library);
late final openDatabase = _library.lookupFunction<
Pointer<_NativeDatabase> Function(),
Pointer<_NativeDatabase> Function()>('OpenDatabase');
late final closeDatabaseAddress =
_library.lookup<NativeFunction<Void Function(Pointer<_NativeDatabase>)>>(
'CloseDatabase');
late final closeDatabase = closeDatabaseAddress
.asFunction<void Function(Pointer<_NativeDatabase>)>();
}
class _NativeDatabase extends Opaque {} - Аннотации
-
- @Since('2.17')
Конструкторы
- NativeFinalizer(Pointer<
NativeFinalizerFunction> callback) factory - Создаёт финализатор с заданным обратным вызовом финализации.
Свойства
- hashCode → int только для чтения, унаследованное
- Код хэша для этого объекта.
- runtimeType → Type только для чтения, унаследованное
- Представление типа времени выполнения объекта.
Методы
- attach(
Finalizable value, Pointer< Void> token, {Object? detach, int? externalSize}) → void - Прикрепляет этот финализатор к
value. - detach(
Object detach) → void - Открепляет этот финализатор от прикрепленных значений с помощью detach.
- noSuchMethod(
Invocation invocation) → dynamic унаследованное - Вызывается при обращении к несуществующему методу или свойству.
- toString(
) → String унаследованное - Строковое представление этого объекта.
Операторы
- operator ==(
Object other) → bool унаследованное - Оператор равенства.
© 2012 the Dart project authors
Licensed under the BSD 3-Clause "New" or "Revised" License.
https://api.dart.dev/stable/2.18.5/dart-ffi/NativeFinalizer-class.html