Subject: Re: Is "-init" really needed?

On 10 Aug 2017, at 15:24, Jeremy Hughes <[email protected]> wrote:
>> On 10 Aug 2017, at 15:15, Alastair Houghton <[email protected]>
>> wrote:
>> On 10 Aug 2017, at 15:09, Charles Srstka <[email protected]> wrote:
>>> They’re equivalent syntactically, but performance-wise, +array and friends
>>> will cause the object to be put into an autorelease pool. Therefore, +new
>>> is better for performance.
>> Not with ARC they don’t. The ARC logic circumvents the autorelease pool in
>> that case.
> Are you sure?

Yes, I’m sure. At the call site, ARC causes the compiler to emit a call to
objc_retainAutoreleasedReturnValue() or
objc_unsafeClaimAutoreleasedReturnValue(), while in the method itself, ARC will
use objc_autoreleaseReturnValue() or objc_retainAutoreleaseReturnValue(). The
latter looks at the code for the call site and, assuming it matches, it will
*not* do the autorelease and will set a flag that causes
objc_retainAutoreleasedReturnValue() to eliminate the retain.

> We had a discussion about autorelease pools recently, and it seems that
> they’re still used by Cocoa APIs (to support ARC and non-ARC code).

Yes, autorelease pools still exist and are still used. Not all code uses ARC,
and for the above optimisation to happen, the code needs to use the functions
mentioned, which will only happen if either (a) it’s compiled with ARC, or (b)
those calls are used explicitly. You can see the code for this in the
Objective-C runtime code, <here:

Kind regards,




Cocoa-dev mailing list ([email protected])

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)

Help/Unsubscribe/Update your Subscription:

This email sent to [email protected]

Programming list archiving by: Enterprise Git Hosting