Welche Art von Speicherlecks kann XCode Analyzer nicht bemerken?

8

Ich fürchte, dass das Stellen dieser Frage zu einigen Downvotes führen kann, aber nachdem ich einige nicht befriedigende Untersuchungen gemacht habe, habe ich beschlossen, ein Risiko einzugehen und erfahrenere Leute zu fragen ...

Es gibt viele Fragen, die sich auf einige spezifische Probleme im Zusammenhang mit dem XCode Analayzer Tool beziehen. Es scheint eine sehr hilfreiche Lösung zu sein. Aber ich möchte Sie - als Anfänger in der iOS-Welt - fragen, welche Art von Speicherverwaltung durch dieses Tool nicht bemerkt werden kann.

Mit anderen Worten, gibt es gemeinsame Aspekte der Speicherverwaltung, über die die iOS-Anfänger denken sollten " Ach, sei vorsichtig, denn in diesem Fall warnt dich der XCode Analyzer möglicherweise nicht vor deinem Fehler "...

Zum Beispiel habe ich hier Why gefunden kann der statische XCode-Analysator nicht freigegebene beibehaltene Eigenschaften erkennen? dass:

  

(...) Der Analyzer kann keine Probleme bezüglich der Retain- / Release-Probleme erkennen   Methoden- / Bibliotheksgrenzen (...)

Es klingt wie ein guter Tipp, den Sie beachten sollten, aber vielleicht wissen Sie etwas über andere häufige Probleme ...

    
guitar_freak 08.03.2013, 12:01
quelle

1 Antwort

7

Der Analysator ist sehr gut darin, die Routine-Lecks zu finden, die neue Programmierer bei der Erstellung von Nicht-ARC-Code plagen (Fehler beim Aufruf von release , Rückgabe von Objekten mit falschem Retain-Zähler usw.).

Nach meiner Erfahrung gibt es ein paar Arten von Speicherproblemen, die es nicht findet:

  • Im Allgemeinen kann starke Referenzzyklen (aka Zyklen beibehalten ). Sie fügen beispielsweise einem View-Controller ein sich wiederholendes NSTimer hinzu, ohne zu wissen, dass der Timer einen starken Verweis auf den View-Controller behält, und wenn Sie invalidate nicht tun (oder an der falschen Stelle, z Die Methode dealloc ), weder der View-Controller noch der Timer werden freigegeben.

  • Es kann keine zirkulären logischen Fehler finden. Zum Beispiel, wenn Sie einige zirkuläre Referenzen haben, wo der View-Controller A den View-Controller B präsentiert, der seinerseits eine neue Kopie von A präsentiert (statt zu verwerfen / zu poppen, um zu A zurückzukehren).

  • Es kann nicht viele nicht-zählende Speicherprobleme finden. Obwohl es im Umgang mit Core Foundation-Funktionen immer besser wird, kann der statische Analysator von begrenztem Nutzen sein, wenn Sie über Code verfügen, der manuelle Speicherzuordnungen durchführt (z. B. via malloc und free ). Dasselbe gilt, wenn Sie nicht-referenzierenden Zählcode verwenden (z. B. verwenden Sie SQLite sqlite3_prepare_v2 und können sqlite3_finalize nicht aufrufen).

Ich bin mir sicher, das ist keine vollständige Liste dessen, was es nicht findet, aber das sind die häufigen Fragen, die ich zu Stack Overflow gestellt habe, für die der statische Analysator nur eine begrenzte Hilfe sein wird. Aber der Analysator ist immer noch ein wunderbares Werkzeug (er findet auch andere Probleme als Speicherprobleme) und für jene Personen, die ARC nicht verwenden, ist es von unschätzbarem Wert.

Nachdem das gesagt wurde, während der statische Analysator eine unterschätzte erste Verteidigungslinie ist, sollten Sie Instrumente wirklich verwenden, um Lecks zu finden. Weitere Informationen finden Sie Speicherprobleme in Ihrer App finden in Instruments User Guide. Das ist der beste Weg, um Lecks zu identifizieren.

    
Rob 08.03.2013, 14:36
quelle