Objective-C: Wie ist ARC in GNUStep aktiviert?

8

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.

%Vor%

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!

    
ljackman 10.11.2013, 22:01
quelle

1 Antwort

5

Lösung : Josh Caswell wies darauf hin, dass mein Compiler-Flag fobj-arc fobjc-arc sein sollte. Da Clang keinen Hinweis darauf gab, dass diese Flagge ungültig ist, überlasse ich diese Antwort jedem anderen.

    
ljackman 10.11.2013 22:23
quelle