Getting completely (I mean ENTIRELY) rid off GC

Paulo Pinto via Digitalmars-d digitalmars-d at puremagic.com
Fri Sep 12 05:39:49 PDT 2014


On Friday, 12 September 2014 at 07:46:03 UTC, eles wrote:
> On Thursday, 11 September 2014 at 19:56:17 UTC, Paulo Pinto 
> wrote:
>> Am 11.09.2014 20:32, schrieb Daniel Alves:
>
>> It is incredible how Objective-C's ARC became a symbol for 
>> reference counting, instead of the living proof of Apple's 
>> failure to produce
>> a working GC for Objective-C that didn't crash every couple of 
>> seconds.
>
> I think I fail to grasp something here. For me, ARC is 
> something that is managed at runtime: you have a counter on a 
> chunk of memory and you increase it with each new reference 
> towards that memory, then you decrement it when memory is 
> released. In the end, when the counter reaches 0, you drop the 
> chunk.
>
> OTOH, code analysis and automatically inserting free/delete 
> where the programmers would/should have done it is not really 
> that. Is a compile-time approach and not different of manual 
> memory management.
>
> Which one is, in the end, the approach took by Apple, and which 
> one is the "true" ARC?...

ARC was a term popularized by Apple when they introduced the said 
feature in Objective-C.

In the GC literature it is plain reference counting.

ARC in Objective-C is a mix of both approaches that you mention.

It only applies to Objective-C classes that follow the 
retain/release patterns since the NeXTStep days. For structs, 
malloc() or even classes that don't follow the Cooca patterns, 
only manual memory management is possible.

The compiler inserts the retain/release calls that a programmer 
would write manually, at the locations one would expect from the 
said patterns.

Then a second pass, via dataflow analysis, removes the pairs of 
retain/release that are superfluous, due to object lifetime 
inside a method/function block.

This way you get automatic reference counting, as long as those 
classes use the said patterns correctly. As a plus the code gets 
to interact with libraries that are clueless about ARC.

Now, having said this, when Apple introduced GC in Objective-C it 
was very fragile, only worked with Objective-C classes, was full 
of "take care of X when you do Y" and required all Frameworks on 
the project to have compatible build settings.

Of course, more often than not, the result was random crashes 
when using third party libraries, that Apple never sorted out.

So ARC in Objective-C ended up being a better solution, due to 
interoperability issues, and not just because RC is better than 
GC.

--
Paulo







More information about the Digitalmars-d mailing list