2009-10-29 9 views
6

Ich bin gerade dabei, meine erste iPhone App fertigzustellen und dachte mir, dass ich sie durch das Leaks Performance Tool laufen lassen würde. Nachdem ich einen offensichtlichen Fehler behoben habe, ist der einzige, den ich noch habe, ein Nib, der als eine über loadNibNamed geladene Tabellenkopfansicht agiert (ich habe hier die Recipes-Demo verfolgt).Speicherleck in loadNibNamed?


- (void)viewDidLoad { 
    [super viewDidLoad]; 

    if (self.tableHeaderView == nil) { 
     [[NSBundle mainBundle] loadNibNamed:@"TableHeaderView" owner:self options:nil]; 
     self.tableView.tableHeaderView = self.tableHeaderView; 
    } 
} 

Dann in dealloc:


- (void)dealloc { 
    [tableHeaderView release]; 
    [super dealloc]; 
} 

Instruments sagt mir, dass ich 256 Bytes bin undicht mit 2 Gasaustritt aus der Linie mit loadNibNamed kommen. TableHeaderView ist das einzige Top-Level-Objekt im Nib (ich habe das im Debugger verifiziert). Gibt es etwas, das ich vergessen habe zu veröffentlichen? Unterscheide ich falsch, was die Instrumente mir sagen? Ist es falsch? Ist es etwas, das das OS später aufräumen wird?

+1

Sie haben NSZombieEnabled nicht? Das wird falsche Lecks in den Instrumenten zeigen. – nall

+0

Nicht, wenn das etwas wäre, hätte ich mich sehr anstrengen müssen. Ist es standardmäßig deaktiviert? – AndrewO

+0

Guter Anruf. Ich bin verrückt geworden. Ich hatte Zombies an. – RyeMAC3

Antwort

2

Gibt es Instrumente, die Ihnen dies nur auf dem Simulator mitteilen, oder meldet es dasselbe auf einem tatsächlichen Gerät? Wenn Sie es nicht auf dem Gerät, dann ist es der Simulator - und das ist bekannt, dass es passiert (es ist kein genau übereinstimmen).

Auch in dealloc, wäre es nicht [self.tableHeaderView release]? Sie müssen mit Ihrer Verwendung konsistent sein.

NS/UI/??xxxxxx *_MyObjectName; //notice the underscore 

Dann wird die Eigenschaft wie folgt:

Um Verwirrung zu vermeiden, in Ihrer .h, würden Sie dies erklären

@property .... NS/UI/??xxxxxx *MyObjectName; //no underscore 

dann die Getter/Setter wie folgt synthetisieren:

Schließlich, beziehen Sie sich auf das Objekt im gesamten Programm mit [self.MyObjectName ...];

+0

Gute Frage zu dem Gerät: Ich bin dabei, mein Gerät einzurichten, um es dort tatsächlich zu testen - ich werde aktualisieren, wenn ich das funktioniere. Ich versuchte, den Freigabeaufruf in Dealloc zu ändern, um selbst zu verwenden, und es gab keine Änderung. Ich dachte, ich hätte irgendwo gelesen, dass man in dealloc eigentlich Zucker vermeiden sollte (obwohl ich es als nicht selbstbewusst bezeichnen würde, wäre es nicht besser)? Oder war das nur Setter? – AndrewO

+0

Ich neige dazu, die lokale Version einer Eigenschaft unberührt zu lassen, es sei denn ich muss (wie es nur gelesen wird). Ansonsten greife ich immer mit mir selbst darauf zu. Ich schlage vor, Apples Samples anzuschauen, aber selbst die allererste Lerner-App weist die gleichen Schwächen auf. Zumindest: Wenn Sie diese Disziplin beibehalten, können Sie später ein Suchen/Ersetzen durchführen, um es auf etwas anderes zu setzen. Sei richtig oder falsch, tue es konsequent! Viel Spaß mit dem Geräteprofil. Code-Signing für die Veröffentlichung macht auch Spaß! Am besten ist es, Apples Guide zu verwenden - wirklich. – inked

+0

Was ist der Zweck des Unterstrichs? – RyeMAC3

5

Wenn Sie eine Feder laden, müssen Sie alle Objekte der obersten Ebene in der NIB-Datei freigeben. Gibt es neben der TableHeaderView noch etwas in dieser Datei?

+0

Nein - Ich habe überprüft, dass es das einzige Objekt der obersten Ebene in der NIB-Datei ist. – AndrewO

+0

Du hörst dich an, als wüsstest du, wovon du sprichst, aber ich habe das nirgendwo dokumentiert gefunden. In der Tat die Dokumente für loadNibNamed-Status "Sie sollten entweder das zurückgegebene Array oder die darin enthaltenen Objekte manuell beibehalten, um zu verhindern, dass die Nib-Dateiobjekte vorzeitig freigegeben werden." - Kannst du bitte etwas ausarbeiten? 10x! –