Benötigt ein Objective-C-Befehlszeilenprogramm einen NSAutoreleasePool?

8

Ich lerne Objective-C, indem ich mit etwas Code in einem einfachen Befehlszeilenprogramm herumspiele, hier ist mein Code:

%Vor%

Ich kompiliere und führe es so:

%Vor%

und die folgende Ausgabe erhalten:

%Vor%

So kann ich sehen, dass der Fehler sich auf die Tatsache bezieht, dass es keinen NSAutoreleasePool gibt, und wenn ich einen hinzufüge, verschwindet der Fehler:

%Vor%

Bin ich also richtig davon ausgegangen, dass eine Befehlszeilenanwendung, die Objekte wie NSString usw. verwendet und mit Foundation kompiliert, einen manuell erstellten Release-Pool benötigt? Und ist mein Beispiel über den besten Weg, es zu tun?

Hinweis: Ich habe auch versucht [hallo release]; ohne den NSAutoreleasePool, um zu sehen, ob ich den Speicher nur manuell löschen könnte, ohne einen Pool zu verwenden, aber das gleiche Problem hatte.

    
Martin 08.06.2011, 19:46
quelle

1 Antwort

9

Ja und ja.

Cocoa (in GUI- oder Foundation-Form) erwartet, dass ein Autorelease-Pool vorhanden ist; Die Interna des Frameworks (nicht nur Ihr eigener Code) verwenden die -autorelease -Nachricht und die Pools großzügig und wenn Sie keine Pools auf dem Autorelease-Pool-Stack haben, werden sie sich beschweren und die Objekte verlieren. wie du gesehen hast.

Ich nehme an, dass die Garbage Collection deaktiviert ist. Ich habe mich damit nie weiterentwickelt, aber in diesem Fall könnte ich mir vorstellen, dass du das nicht brauchen würdest.

Update Autorelease-Pools können jetzt mit einem @autoreleasepool {...} -Block erstellt werden, der den gleichen Effekt hat, und einige nette Boni wie die Fähigkeit, einfach zu springen / zurückzukehren.

    
Ben Zotto 08.06.2011, 19:53
quelle

Tags und Links