Frage

Ich bin für eine primäre Quelle (oder eine wirklich gute Erklärung), um den Anspruch zu untermauern, dass die Verwendung von autorelease gefährlich ist oder übermäßig teuer, wenn die Software für das iPhone zu schreiben.

Mehrere Entwickler machen diesen Anspruch, und ich habe sogar gehört, dass Apple es nicht empfehlen, aber ich habe es nicht gelungen, konkrete Quellen auftauchen um es wieder auf.

SO Referenzen:
Autorelease-iphone
Warum schafft dies ein Speicherleck (iPhone)?

. Hinweis: Ich kann sehen, aus konzeptioneller Sicht, dass autorelease ist etwas teurer als ein einfacher Anruf release, aber ich glaube nicht, dass kleine Strafe genug ist, um gegen sie zu machen Apfel empfehlen

Was ist die wahre Geschichte?

War es hilfreich?

Lösung

(können Sie Ihre eigene Antwort nicht akzeptieren?)

Nun, nach allem, was ich habe es geschafft, einen Verweis von Apple Developer zu finden, hinzugefügt als Randnotiz in der Nähe des unteren Rand der Seite:

  

iPhone OS Hinweis: Da auf dem iPhone OS   eine Anwendung ausführt, in einem mehr   Speicherbeschränkte Umgebung des   Verwendung von Autorelease Pools   in Methoden oder Blöcke von entmutigt   Code (beispielsweise Schleifen), wo ein   Anwendung schafft viele Objekte.   Stattdessen sollten Sie explizit freigeben   wann immer möglich, Objekte.

Still legt dies nahe, Autorelease mit sorgfältig, nicht ganz zu vermeiden.

(und jetzt meinen Kommentar)

Es klingt wie es eine bestimmte Menge an Overhead ist auf den Pool zu halten. Ich las diesem Artikel was mich wahrscheinlich führen vermeiden, so viel wie möglich Autorelease, weil ich es lieber, konsequent sein. Wenn Sie etwas Speicher unter Autorelease und andere Speicher haben wird vollständig manuell verwaltet es etwas verwirrend sein kann.

Andere Tipps

Es ist nicht die Frage zu verwenden oder nicht Autofreigabe zu verwenden, da in einigen Fällen Autorelease ist der einzige Weg, durch die Sie erhalten. Die Frage sollte „ Warum für alle Objekte nicht verwenden Autorelease, anstelle der Verwendung behalten und lassen Sie? “.

Um das zu beantworten, sollten Sie zunächst lernen, was für Autofreigabe eine ordnungsgemäße Verwendung ist. Lassen Sie uns sagen, dass Sie eine Klasse, die zwei Eigenschaften hat: Vorname und Nachname. Es gibt einen Getter und einen Setter für jeden. Aber Sie müssen auch eine Methode, die fullname zurückkehren würde, durch diese beiden Strings in ein brandneues Verketten:

- (NSString *) fullName {
   NSString str = [[NSString alloc]initWithFormat:@"%@ %@", firstName, lastName];
   // this is not good until we put [str autorelease];
   return str;
}

Was ist mit diesem Bild falsch? Der Referenzzähler auf dem zurückgegebenen String ist 1, wenn Sie also der Anrufer sollte es nicht auslaufen wollen, loslassen, wenn er fertig ist. Aus der Sicht des Anrufers, bat er nur einen Eigenschaftswert fullName. Er ist sich der Tatsache, dass er ein ganz neues Objekt bekam, dass er nach dem Gebrauch freigeben sollte, und nicht eine Referenz auf ein NSString intern von der Klasse gehalten!

Wenn wir die [str release] vor der Rückkehr setzen würden die Zeichenfolge zerstört und das Verfahren zurückkehren würde Müll! Das ist, wo wir [str autorelease] verwenden, um das Objekt für die Freigabe zu einem späteren Zeitpunkt markieren (in der Regel, wenn die Ereignisverarbeitung erfolgt). So kann der Anrufer seine Aufgabe bekommt, und muss sich keine Sorgen machen, ob er es freigeben soll oder nicht.

Die Konvention ist auf einem neuen Objekt aufzurufen Autorelease, bevor die Methode es an den Aufrufer zurückgibt. Ausnahmen sind Methoden mit Namen, die mit alloc, new oder copy starten. In solchen Fällen wissen die Anrufer, dass ein ganz neues Objekt für sie geschaffen, und es ist ihre Aufgabe an diesem Objekt freigeben zu nennen.

Ersetzen Release mit Autorelease insgesamt ist eine schlechte Idee, da die Objekte anhäufen würden und verstopfen die Speicher sehr schnell, vor allem in Schleifen. Die Ressourcen auf dem iPhone sind begrenzt, so um hogging Speicher zu minimieren, ist es Ihre Aufgabe ist es, das Objekt freizugeben, sobald Sie damit fertig sind.

Ich bin nicht einverstanden, dass die Vermeidung Autofreigabe ganz klug ist.

Cocoa Touch verwendet es recht häufig intern und in vielen Situationen ist es der einzige Weg, um Speicher richtig zuzuordnen (ein gutes Beispiel ist wiederverwendbar Tabellenansicht Zellen). Wenn Sie verstehen, was geschieht, ist der Autofreigabepool ein großes Werkzeug zur Verfügung. Die wichtigste Sache zu erinnern ist, dass die Blöcke erst irgendwann später im Laufschleife befreit. Wenn Sie eine enge Schleife ohne Benutzereingriff ausführen und Autorelease Blöcke stapeln, werden Sie schließlich über genügend Arbeitsspeicher ausgeführt.

Autorelease ist kein Ersatz für die Garbage Collection (nicht verfügbar im iPhone SDK) und zu den bösen baumelnden Zeiger Fehler führen kann (der Zeiger scheint immer noch gut zu sein, dann auf einige unvorhersehbare Punkt ungültig geht), sondern ist auch sehr nützlich, schriftlich klar und einfach Code zu erhalten. Betrachten Sie den folgenden Fall:

[aDictionary writeToFile:
     [documentsDirectory stringByAppendingPathComponent:@"settings.plist"]
              atomically:YES];

Der Pfad-String wird als Autorelease-Objekt erzeugt. Wir sind nicht ein temporäres Objekt erstellen erforderlich, so dass wir vermeiden, dass die Gemeinkosten (und die Möglichkeit wir es vergessen könnten zu lösen). Der Speicher wird vollständig freigegeben werden (keine Lecks), nur, dass es später im Laufe Schleife passieren wird. Fragen Sie sich: werde ich Hunderte von diesen zuzuteilen, bevor ich wieder auf Benutzereingaben bekommen? Falls nein (wie es hier der Fall wäre), Autorelease ist eine großartige Lösung und in der Tat diese NSString Methode für mit Pfaden arbeiten nur verfügbar mit Autoreleased Speichern.

ich mit dem oben Plakate einverstanden, dass Konvention folgen und konsequent ist eine sehr gute Idee ist.

Ich neige dazu, mit Autorelease auf dem iPhone zu vermeiden, wo ich kann (als Jon aufzeigt, kann man nicht immer, ohne es tun), einfach weil ich weiß, dass die Objekte mit arbeite ich in den Augenblick freigegeben werden I brauchen sie nicht. Speichereinschränkungen sind eines der größten Probleme, die Sie auf dem Gerät konfrontiert werden und ich glaube, sie sind die Quelle der meisten der Absturz Probleme werden Sie es erfahren.

Wie von Apple hervorgehoben, ein besonderes Anliegen ist, wenn Sie Autoreleased Objekte innerhalb jeder Art von Schleife verwendet werden, da sie innerhalb des Autofreigabepool anhäufen werden. Sie müssen dann verwalten, wenn Sie den Pool entleeren oder erstellen / eine loslassen. Dadurch, dass jeder durch die Schleife der Leistung verringern, aber zu viele Pässe gehen, ohne zu gefährlicher Speichernutzung führen könnte. Ich bin zwicken noch dies in Molekülen, weil es intermittierende Speicherprobleme sind, wenn große (> 2 MB) Textdateien aus dem Protein Data Bank zu importieren. Ich konnte die Leistung verbessern, indem sie Autoreleased Objekte zu minimieren, kann sie aber nicht vollständig beseitigen.

Ein weiterer Bereich, zu achten ist Autoreleased Objekte mit Threads. Wenn möglich, verwenden Sie keine Autoreleased Objekte, wenn sie mit Methoden, die auf einem Hintergrund-Thread ausgeführt zu tun, da der Pool kann zu zufälligen Zeiten abgelassen werden. Dies führt zu unerwarteten Abstürzen, die wirklich Spaß machen kann, aufzuspüren.

Ich würde es wie die Pest sehr empfehlen, zu vermeiden Autorelease. Speicherverwaltung Bugs sind eine gute Möglichkeit, riesige Mengen an Zeit und Geld zu verschwenden, ich habe die zweifelhafte Ehre hatte, gehen durch den Prozess eine viele Zeit auf alten Mac-Anwendungen, und die Tatsache, dass das iPhone fest Speicherbeschränkungen hat bedeutet, dass Sie haben sehr vorsichtig, oder die App wird nur instabil sein und oft zum Absturz bringen ... wie so viele der ersten Anwendungen, die im letzten Sommer veröffentlicht wurden.

Die einzige zuverlässige Weise, die ich gefunden habe, stabile iPhone-Anwendungen zu schreiben, ist alles selbst Ihr Gedächtnis zu verwalten, und tun es konsequent. Auch wenn Sie der einzige Programmierer an Ihrem Projekt sind, befinden Sie sich später danken. Es kann schwierig sein, wenn Sie in Sprachen programmieren gelernt, dass „für Sie um alles kümmern“, aber es lohnt sich wirklich zu lernen, wie gut zu tun, wenn Sie ernsthaft über Qualität iPhone apps createing.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top