2012-03-25 9 views
0

Ich bin kurz vor dem Ende meiner ersten App und ich versuche, durch meine Fehler und Speicherverwaltung zu gehen und alles zu bereinigen.Speicherleck von Methode in Analysator

Im Analysator in Xcode die folgende Zeile kommt als „potentielles Speicherleck“ up

- (NSMutableArray *) convertStringToASCIIMutableArray:(NSString *)stringIn { 
    NSLog(@"call:convertStringToASCIIMutableArray"); 

    NSMutableArray *arrayOut = [[NSMutableArray alloc] initWithCapacity:stringIn.length]; 
    //NSMutableArray *arrayOut = [NSMutableArray arrayWithCapacity:stringIn.length]; 

    for (int i=0; i<stringIn.length; i++) { 
     unichar ch = [stringIn characterAtIndex:i]; 
     if (ch > 96 && ch<123) ch = ch - 32; // convert to all capitals 
     [arrayOut insertObject:[NSNumber numberWithChar:ch] atIndex:i]; 
    } 
    return arrayOut; 
} 

aber wenn ich den Alloc Anruf zu entfernen (wie in der kommentierten Linie oder mit einem Autofreigabe) der App abstürzt. Wer weiß, was hier los ist?

+1

Sind Sie mit ARC oder nicht? –

+0

Es ist sehr wichtig zu wissen, ob Sie ARC verwenden oder nicht. – Byron

Antwort

0

Nun Ich nicht wirklich mein Problem per se lösen, aber ich umgewandelt mein Projekt mit dem neuen automatischen Reference Counting (ARC dank @Kurt Revis und @Byron uns auf dieses Merkmal, um meine Aufmerksamkeit) zu kompilieren

Um mein Projekt zu konvertieren, ging ich einfach zu bearbeiten> Refactor> In Obj-C ARC konvertieren. Dann musste ich mich an die neuen Regeln der Speicherverwaltung halten, wie sie nach dem "Check" im Refactoring-Fenster gefragt wurden. Im Wesentlichen musste ich einige Releases in meiner Dealloc-Methode entfernen, aber es kam mit einigen Warnungen im Problem-Navigator, um mir zu sagen, was zu tun ist.

ARC scheint groß zu sein. Weitere Informationen finden Sie hier:

Steffen Itterheim

0

"arrayOut" wird nicht automatisch freigegeben, wenn Sie sich in einer manuellen Referenzzählungsumgebung befinden.

Ändern Sie return arrayOut in return [arrayOut autorelease] und das Array wird am Ende des aktuellen Runloops freigegeben.

+0

das funktioniert auch nicht. Es sagt, dass ArrayOut zu oft Autofreigabe gesendet wurde – bkbeachlabs

+0

die beste Praxis für nicht ARC ist, ein Autoreleased-Objekt, nicht Autorelease in der Empfangsmethode, was ich vermute, dass Sie tun. – borrrden

0

Hier nichts zu sehen. Das "potentielle Leck" ist da, weil Sie das veränderbare Array mit alloc-init erstellen und es nicht freigeben, wenn die Methode abgeschlossen ist. Da Sie das Objekt zurückgeben, empfehle ich Ihnen, eine Autorelease-Version zu erstellen.

Jetzt für den App-Absturz bei Verwendung einer Autorelease-Version müssen Sie sehen, wo es abstürzt und was Sie tun, bis zum Absturz führen. Kennen Sie einen Haltepunkt, wenn eine Ausnahme ausgelöst wird? Wenn nicht, folgen dieser und der Code wird an der Linie zu stoppen, wenn der Absturz passiert, so können Sie es debuggen:

  • Drücken Sie Befehl + 6 in Xcode
  • Klicken Sie auf die Schaltfläche + in der unteren linken Ecke
  • Wählen Sie Ausnahme-Haltepunkt hinzufügen
  • Legen Sie die Optionen für Alle Ausnahmen fest, und klicken Sie auf "Fertig".
+0

Ich habe Breakpoints für das Debugging von Test und Fehlern verwendet, aber das scheint mir mehr Dank zu geben. Ich werde es versuchen – bkbeachlabs