@@ -76,9 +76,9 @@ struct NSObjectData {
7676 public NSObject . Flags flags ;
7777 }
7878
79- class NSObjectDataHandle : CriticalHandle {
79+ class NSObjectDataHandle : SafeHandle {
8080 public NSObjectDataHandle ( )
81- : base ( IntPtr . Zero )
81+ : base ( IntPtr . Zero , true )
8282 {
8383 unsafe {
8484 this . handle = ( IntPtr ) NativeMemory . AllocZeroed ( ( nuint ) sizeof ( NSObjectData ) ) ;
@@ -90,7 +90,7 @@ public unsafe NSObjectData* Data {
9090 }
9191
9292 public override bool IsInvalid {
93- get => handle ! = IntPtr . Zero ;
93+ get => handle = = IntPtr . Zero ;
9494 }
9595
9696 protected override bool ReleaseHandle ( )
@@ -1000,6 +1000,8 @@ protected virtual void Dispose (bool disposing)
10001000 } else {
10011001 NSObject_Disposer . Add ( this ) ;
10021002 }
1003+ // DO NOT dispose data_handle here, we rely on it being disposed by the GC in a later garbage collection
1004+ // data_handle.Dispose ();
10031005 }
10041006 }
10051007
@@ -1025,6 +1027,11 @@ private NSObject_Disposer ()
10251027 static internal void Add ( NSObject handle )
10261028 {
10271029 bool call_drain ;
1030+
1031+ var success = false ;
1032+ handle . data_handle . DangerousAddRef ( ref success ) ;
1033+ // 'success' will never be false here, because DangerousAddRef will throw an exception in case of failure.
1034+
10281035 lock ( lock_obj ) {
10291036 handles . Add ( handle ) ;
10301037 call_drain = handles . Count == 1 ;
@@ -1064,8 +1071,10 @@ static void Drain (NSObject ctx)
10641071 handles = drainList1 ;
10651072 }
10661073
1067- foreach ( NSObject x in drainList )
1074+ foreach ( NSObject x in drainList ) {
10681075 x . ReleaseManagedRef ( ) ;
1076+ x . DangerousRelease ( ) ;
1077+ }
10691078 drainList . Clear ( ) ;
10701079
10711080 lock ( lock_obj ) {
0 commit comments