[cfe-dev] ARC and @synthesize of read only property

David Chisnall csdavec at swan.ac.uk
Wed Jul 20 01:57:11 PDT 2011

On 19 Jul 2011, at 21:06, Jean-Daniel Dupas wrote:

> Thank you for the explanation. So the retained/autorelease is a new behavior introduced with ARC. AFAIK, the getter did this only for atomic properties in non ARC mode.

You can check the generated IR.  In ARC mode, it calls objc_getProperty() for atomic properties.  For  nonatomic properties, it accesses the ivar directly and calls objc_retainAutoreleaseReturnValue().  If you do something like:

id o = [object synthesizedNonatomicProperty];

Then ARC will translate this into something like:

o = objc_retainAutoreleasedReturnValue([object synthesizedNonatomicProperty]);

This skips the autorelease pool, so the object is now retained in the caller but not present in the autorelease pool.  ARC will then objc_release() it at the end of the scope of o.  This means that you get a lot less redundant autorelease pool churn in ARC mode.

>> Even in ARC mode, the compiler can't magically guess what you mean.  
> While it cannot always guess, when the @synthezise directive specify an ivar, it can default to the ivar ownership, as this is the only acceptable value.

Ivars all default to __strong, but it sounds like you actually want unsafe_unretained (which would then simply be objc_retain()'d in the caller in ARC mode).  


More information about the cfe-dev mailing list