Objective-C / ARC / Speicherverwaltung Fragen wurden bis zum Tod auf SO getan, aber diese scheint etwas anders als die bestehenden.
Ich habe versucht, Objective-C mit GNUStep und Clang zu verwenden. Ich habe die Bibliotheken heruntergeladen
Offensichtlich erforderlich für moderne Objective-C-Features wie ARC; Blöcke arbeiten und @autoreleasepool
s werden vom Compiler zusammen mit dem zugehörigen Compiler-Flag akzeptiert. Das AppKit GUI-Toolkit funktioniert ebenso wie der Warteschlangen-Dispatcher.
Mein richtiges Verständnis besteht darin, dass alloc
ed-Objekte automatisch so eingerichtet werden, dass sie beim Verlassen eines @autoreleasepool
eines "übergeordneten" Stapelrahmens freigegeben werden, und dass durch das Freigeben eine Referenzzählung verringert wird. Der Compiler beklagt jedoch keine manuelle [super dealloc]
und toleriert manuelle autoreleases
und releases
, was bedeutet, dass ARC nicht einmal eingeschaltet ist.
Man könnte sich vorstellen, dass das googeln von GNUStep ARC ~enable
zu einem Compiler-Flag führt, das ich verpasse, aber das tut es nicht.
Hier ist ein Beispielcode. Es ist ein Objekt-Wrapper um ein multidimensionales Array von C99 bool
s, das ist malloc
ed in init
und free
d innerhalb dealloc
, was ich als eine der wenigen legitimen Nutzungen von dealloc
erhalte innerhalb des ARC-Codes. Beachten Sie, dass dealloc
s puts
nicht aufgerufen wird, nachdem der @autoreleasepool beendet wurde, obwohl nur ein einziger Verweis darin erstellt wurde. Ein manuelles release
oder autorelease
funktioniert jedoch großartig.
Mein kompilierendes Skript (Ich benutze ein richtiges Makefile, sobald ich das funktioniere): -
%Vor% Ich bin davon ausgegangen, dass autorelease
für Objekte abgeleitet werden soll, die in @autoreleasepool
erstellt wurden.
Vielen Dank im Voraus!
Tags und Links objective-c memory-management automatic-ref-counting gnustep autorelease