diff --git a/core-text/src/font_descriptor.rs b/core-text/src/font_descriptor.rs index 4a8c67bf..9e6dd60c 100644 --- a/core-text/src/font_descriptor.rs +++ b/core-text/src/font_descriptor.rs @@ -311,9 +311,8 @@ impl CTFontDescriptor { unsafe { let value = CTFontDescriptorCopyAttribute(self.0, kCTFontTraitsAttribute); assert!(!value.is_null()); - let value = CFType::wrap_under_create_rule(value); - assert!(value.instance_of::()); - CFDictionary::wrap_under_get_rule(value.as_CFTypeRef() as CFDictionaryRef) + // Use wrap_under_create_rule for the dictionary directly to maintain ownership + CFDictionary::wrap_under_create_rule(value as CFDictionaryRef) } } diff --git a/core-text/src/font_manager.rs b/core-text/src/font_manager.rs index dff0f8d0..ef27bd90 100644 --- a/core-text/src/font_manager.rs +++ b/core-text/src/font_manager.rs @@ -21,8 +21,9 @@ pub fn copy_available_font_family_names() -> CFArray { pub fn create_font_descriptor(buffer: &[u8]) -> Result { let cf_data = CFData::from_buffer(buffer); unsafe { - let ct_font_descriptor_ref = - CTFontManagerCreateFontDescriptorFromData(cf_data.as_concrete_TypeRef()); + // Keep cf_data alive by getting the raw pointer within the unsafe block + let data_ref = cf_data.as_concrete_TypeRef(); + let ct_font_descriptor_ref = CTFontManagerCreateFontDescriptorFromData(data_ref); if ct_font_descriptor_ref.is_null() { return Err(()); }