在 kotlin 本机中,有 memScoped 函数,当控制超出范围时,它会自动释放分配的内存。 有没有像局部对象的析构函数之类的东西?
当前的 Kotlin/Native 不提供当内存中不再需要某个对象时调用方法的机制(Java 语音中的终结器),但内联 lambda 可以轻松实现机制,类似于 C++ 中的 RAII。例如,如果您想确保某些资源在离开特定范围后始终被释放,您可以这样做:
class Resource {
fun take() = println("took")
fun free() = println("freed")
}
inline fun withResource(resource: Resource, body: () -> Unit) =
try {
resource.take()
body()
} finally {
resource.free()
}
fun main(args: Array<String>) {
withResource(Resource()) {
println("body")
}
}
您可以将关联对象添加到 Kotlin 原生对象(通过
objc_setassociatedobject
)。每当 Kotlin 对象被释放时,关联的对象也会被释放。该关联对象中的 dealloc 方法可以用作终结器:
typedef void (^FinalizerBlock)(void);
@interface FinalizationMonitor: NSObject
- (instancetype)initWithTarget:(id)target finalizer:(FinalizerBlock)finalizer;
@end
@implementation FinalizationMonitor {
FinalizerBlock _finalizer;
}
static char const *kFinalizerKey = "finalizer";
- (instancetype)initWithTarget:(id)target finalizer:(FinalizerBlock)finalizer {
if ((self = [super init])) {
_finalizer = finalizer;
objc_setAssociatedObject(target, kFinalizerKey, self, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
return self;
}
- (void)dealloc {
_finalizer();
}
@end
val kotlinObject = ... // Some kotlin object
FinalizationMonitor(target = kotlinObject) {
// Perform your finalization logic.
}
当然,这是一种解决方法,而不是理想的解决方案