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     gpar...@apple.com     Runtime Wrangler



_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

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:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to