Spec-Zone.ru › Dart 2

dart:ffi

Класс NativeFinalizer

Нативный финализатор, который можно присоединить к объектам Dart.

При вызове attach для объекта 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.19.6/dart-ffi/NativeFinalizer-class.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API