kotlin-native 有析构函数吗?

问题描述 投票:0回答:2

在 kotlin 本机中,有 memScoped 函数,当控制超出范围时,它会自动释放分配的内存。 有没有像局部对象的析构函数之类的东西?

kotlin native kotlin-native
2个回答
18
投票

当前的 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") 
   }
}

0
投票

您可以将关联对象添加到 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.
}

当然,这是一种解决方法,而不是理想的解决方案

© www.soinside.com 2019 - 2024. All rights reserved.