On 9 Aug 2011, at 12:05 PM, David Duncan wrote: > On Aug 8, 2011, at 11:43 PM, Roland King wrote: > >> After a bit of googling I came across some posts which explained >> Block_Copy() would treat a variable adorned with __attribute__((NSObject)) >> similarly to NSObjects and retain them. So changing the method signature to >> this >> >> -(void)convert:(__attribute__((NSObject))CGImageRef)image >> withBlock:(ImageResizedBlock)callbackBlock >> >> appears to do the right thing in my testing, the CGImageRef is CFRetain()ed >> when the block is enqueued and I assume CFRelease()d later. I prefer this >> syntax, as I find it self-documenting; >> >> I can't find anywhere apart from blog posts and the block specification >> itself which says this works. Does anyone know if it's officially supported, >> for gcc and clang and something that apple is likely to support going >> forward into ARC > > The ARC specification defines a "retainable pointer" as including those > pointers that have the __attribute__((NSObject)) decoration, so this should > behave as expected under ARC. > <http://clang.llvm.org/docs/AutomaticReferenceCounting.html#objects>
I am curious, though, in that CGImageRef is not toll-free bridged to a Foundation class. I had the impression that the API contract was that only bridged CF classes were guaranteed to implement reference-counting methods. The clang document I read seemed to say that the purpose of __attribute__((NSObject)) was to reassure the compiler that the argument type was an alias for an NSObject subclass. At the page you cite, I see: > A retainable object pointer is either a null pointer or a pointer to a valid > object. [Further qualifications.] ... Otherwise ARC does not enforce the > Objective-C type system as long as the implementing methods follow the > signature of the static type. It is undefined behavior if ARC is exposed to > an invalid pointer. > > For ARC's purposes, a valid object is one with well-behaved retaining > operations. Specifically, the object must be laid out such that the > Objective-C message send machinery can successfully send it the following > messages: > > • retain, taking no arguments and returning a pointer to the object. > • release, taking no arguments and returning void. > • autorelease, taking no arguments and returning a pointer to the > object. I believe the OP when he says it works in his setup, but I wonder if the API promises it will always work. Have I missed something? — F _______________________________________________ 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: http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com