Re: ARC and CFType release callback
Re: ARC and CFType release callback
- Subject: Re: ARC and CFType release callback
- From: Greg Parker <email@hidden>
- Date: Wed, 20 Jun 2012 10:37:54 -0700
On Jun 19, 2012, at 10:19 PM, Dave Keck wrote:
>> Once you have a CFTypeRef via CFBridgingRetain(), ARC doesn't care what you do with it. Convert it to and from uintptr_t, pass it through a void*, send it around via IPC, whatever.
>
> That makes sense. I'm also looking for a pattern similar to this RR
> code, so that I can leave out explicit CFReleases:
>
> CGPatternRef pattern = [(id)CGPatternCreate(...) autorelease];
> CGColorRef color = [(id)CGColorCreateWithPattern(...) autorelease];
>
> Is this pattern possible in ARC? I know I could use something like this:
>
> id pattern = CFBridgingRelease(CGPatternCreate(...));
> id color = CFBridgingRelease(CGColorCreateWithPattern(...));
>
> But losing the variable type information isn't worth using ARC. I
> figured I could make a special function:
>
> static void *MyCFAutorelease(CFTypeRef object)
> {
> return (__bridge void *)CFBridgingRelease(object);
> }
>
> and use code that looks like:
>
> CGPatternRef pattern = MyCFAutorelease(CGPatternCreate(...));
> CGColorRef color = MyCFAutorelease(CGColorCreateWithPattern(...));
>
> But this code isn't safe under ARC is it? I would think that since
> they're CFTypes, they're invisible to ARC and can be deallocated
> early.
Correct, that's unsafe. ARC won't retain it because there aren't any object-typed variables pointing to it, and CF stopped retaining it when you said CFBridgingRelease().
One solution is to write MyCFAutorelease() in a non-ARC file. Then you can call autorelease on your CF objects and ARC will be blissfully unaware.
#if !__has_feature(objc_arc)
# error this file must be compiled with ARC off
#endif
CFTypeRef MyCFAutorelease(CFTypeRef obj) {
return (CFTypeRef)[(id)obj autorelease];
}
There might be attributes you can add here to pacify the static analyzer's retain count checking.
--
Greg Parker email@hidden Runtime Wrangler
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden