diff --git a/runtime/src/main/cpp/ObjCExport.mm b/runtime/src/main/cpp/ObjCExport.mm index eacaa6fd86a..a89b3157d15 100644 --- a/runtime/src/main/cpp/ObjCExport.mm +++ b/runtime/src/main/cpp/ObjCExport.mm @@ -127,6 +127,11 @@ static inline id AtomicSetAssociatedObject(ObjHeader* obj, id associatedObject) } } +@interface NSObject (NSObjectPrivateMethods) +// Implemented for NSObject in libobjc/NSObject.mm +-(BOOL)_tryRetain; +@end; + @interface KotlinBase : NSObject @end; @@ -189,6 +194,20 @@ static inline id AtomicSetAssociatedObject(ObjHeader* obj, id associatedObject) return self; } +-(BOOL)_tryRetain { + ObjHeader* obj = kotlinObj; + if (obj->permanent()) { + return [super _tryRetain]; + } else if (!obj->has_meta_object()) { + // Then object is being deallocated; + // return `NO` as required by _tryRetain semantics: + return NO; + } else { + AddRefFromAssociatedObject(obj); + return YES; + } +} + -(oneway void)release { ObjHeader* obj = kotlinObj; if (obj->permanent()) {