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