diff --git a/Headers/CoreFoundation/CFBase.h.in b/Headers/CoreFoundation/CFBase.h.in index 47fdead..8d71a44 100644 --- a/Headers/CoreFoundation/CFBase.h.in +++ b/Headers/CoreFoundation/CFBase.h.in @@ -451,14 +451,14 @@ CF_EXPORT void *_CFBridgingRelease (CFTypeRef cf); CF_EXPORT CFTypeRef _CFBridgingRetain (void *obj); #if __has_feature(objc_arc) -#define CFBridgingRetain(x) _CFBridgingRetain((__bridge void *)(x)) -#define CFBridgingRelease(x) (__bridge id)(_CFBridgingRelease(x)) +#define CFBridgingRetain(x) (__bridge_retained CFTypeRef)(x) +#define CFBridgingRelease(x) (__bridge_transfer id)(x) #elif __OBJC__ #define CFBridgingRetain(x) _CFBridgingRetain((void *)(x)) -#define CFBridgingRelease(x) (id)_CFBridgingRelease(x) +#define CFBridgingRelease(x) (id)_CFBridgingRelease((x)) #else #define CFBridgingRetain(x) _CFBridgingRetain((void *)(x)) -#define CFBridgingRelease(x) _CFBridgingRelease(x) +#define CFBridgingRelease(x) _CFBridgingRelease((x)) #endif #endif /** \} */ diff --git a/Source/CFRuntime.c b/Source/CFRuntime.c index 875c9ba..55f7d4e 100644 --- a/Source/CFRuntime.c +++ b/Source/CFRuntime.c @@ -387,20 +387,23 @@ CFRetain (CFTypeRef cf) CFTypeRef CFAutorelease (CFTypeRef cf) { - // FIXME: this is leaking - return cf; +#if __has_feature(objc_arc) + return objc_autoreleaseReturnValue(cf); +#else + CF_OBJC_FUNCDISPATCHV(CFTypeRef, CFTypeRef, cf, "autorelease"); +#endif } void * _CFBridgingRelease (CFTypeRef cf) { - return objc_autoreleaseReturnValue(cf); + CF_OBJC_FUNCDISPATCHV(CFTypeRef, void *, cf, "autorelease"); } CFTypeRef _CFBridgingRetain (void *obj) { - return objc_retain(obj); + CF_OBJC_FUNCDISPATCHV(void *, CFTypeRef, obj, "retain"); } const void *