Warum enthalten die iOS-main.m-Vorlagen eine Rückgabeanweisung und einen Autorelease-Pool?

9

Ich habe UIApplicationMain documentation erneut gelesen und mich gefragt, ob UIApplicationMain niemals zurückkehrt, warum:

  • Gibt es am Ende ein return ?
  • gibt es ein NSAutoreleasePool ?

Ich frage mich selbst: Warum int main(int argc, char *argv[]) auf einem iPhone? Können wir Apps über eine Befehlszeile starten? Was sind argc und argv für? Werden sie benutzt oder nur Legacy C?

Einige Kommentare von ehrenwerten Kollegen auf Twitter:

  • return ist hier für den Compiler
  • Das NSAutoreleasePool ist nutzlos.
  • Die Run-Schleife benötigt einen AutoRelease-Pool, der zugewiesen wird (im Gegensatz zu # 2)
Cyril Godefroy 05.07.2011, 20:03
quelle

2 Antworten

4

1) Die return-Anweisung ist wahrscheinlich nur da, weil der Compiler nicht weiß, dass die Funktion niemals zurückkehren kann (sie ist schließlich nicht besonders markiert). Die Code-Flow-Analyse des Compilers würde also warnen, dass eine Rückgabeanweisung fehlt. Das erklärt jedoch immer noch nicht, warum UIApplicationMain () einen Rückgabewert hat. Vielleicht gibt es eine Fehlersituation, in der tatsächlich zurückkommen kann, wer weiß.

2) Ich denke, ein Autorelease-Pool in main () um UIApplicationMain ist falsch, da jedes Objekt, das ohne einen Pool freigegeben wurde, in diesem Autorelease-Pool endet, der für die gesamte Dauer von Anwendung. So effektiv ist das Objekt immer noch durchgesickert.

Wenn normalerweise kein Autorelease-Pool vorhanden ist, protokolliert die Laufzeitumgebung eine Fehlermeldung über den fehlenden Pool und weist den Entwickler an, einen Haltepunkt auf _NSAutoreleaseNoPool festzulegen, um zu ermitteln, wo die poollose automatische Freigabe stattfindet. Der Top-Level NSAutoreleasePool, wie er in den Templates gefunden wird, verbirgt somit dieses Leck von den Benutzern.

UIApplicationMain () sollte nach Bedarf einen eigenen Autorelease-Pool erstellen (Er muss einen Pool trotzdem einmal durch die Ereignisschleife erstellen und abreißen, sonst würden sich die Objekte einfach im äußeren Pool aufaddieren und den gesamten Speicher verbrauchen). Wenn jemand denkt, dass er vor dem Aufruf von UIApplicationMain () wirklich ObjC-Code ausführen muss (und sie können nicht die gleiche Arbeit in applicationDidFinishLaunching oder dergleichen), können sie immer einen Pool erstellen vor UIApplicationMain () . Da UIApplicationMain () nachweislich nie zurückkehrt (wie exit ()), hat es keinen Sinn, Befehle trotzdem zu folgen. Der Pool würde nie freigegeben werden.

Wenn Sie sich die Mac-Vorlagen ansehen, haben sie tatsächlich keinen Pool.

3) Die Parameter werden auch verwendet, wenn Sie auf eine Anwendung auf dem Mac doppelklicken. Das Betriebssystem gibt bestimmte Informationen so an die Anwendung weiter. Der erste Parameter ist der Pfad zur ausführbaren Datei beim Start, die notwendig ist, um Dateien im Bundle zu finden, nehme ich an. Auf dem Mac wird die PSN (Prozessseriennummer) auch als Parameter an eine Anwendung übergeben, wenn sie vom Finder aus gestartet wird:

%Vor%     
uliwitness 05.07.2011, 20:08
quelle
0

Wenn Sie im iOS-Apparat direkt die App starten, erhalten Sie nur einen Argument, den App-Pfad

%Vor%

Wenn Sie Dateien öffnen, URLs usw. von den UIApplication-Delegate-Methoden lesen können, müssen die anderen Informationen von demselben Mechanismus verarbeitet werden.

    
Cyril Godefroy 05.07.2011 20:46
quelle

Tags und Links