2010-11-20 13 views
0

ich ein Speicherleck, wenn ich eine Methode aufrufen, die mir zurückgeben eine Zeichenfolge ---- die Methodendefinition ist wie folgtSpeicherverlust Situation in iphone

-(NSMutableArray *)read 
{ 
NSMutableArray *dataArray = [[NSMutableArray alloc] init]; 

//picking data from database here 


return dataArray; 
} 

dies ein großer Speicher i Leck zeigen auch versucht --- NSMutableArray *dataArray = [[[NSMutableArray alloc] init]autorelease];

aber diesmal leack Prüfprozess wird

i gehängt auch nicht das Array vor der Rückkehr freigeben kann

bitte hilfe

Antwort

3
-(NSMutableArray *)read 
{ 
    NSMutableArray *dataArray = [[NSMutableArray alloc] init]; 

    //picking data from database here 

    return dataArray; 
} 

Alles, was die Methode verwendet read erwarten, dass ein Objekt, um wieder er nicht besitzt. Wie hier beschrieben, befindet sich dataArray jedoch immer noch am Rückkehrpunkt. Du kannst es nicht veröffentlichen, weil es das Ganze verschwinden lassen könnte. Sie müssen in diesem Fall das Array automatisch freigeben. Sie können entweder dies tun:

-(NSMutableArray *)read 
{ 
    NSMutableArray *dataArray = [[[NSMutableArray alloc] init] autorelease]; 

    //picking data from database here 

    return dataArray; 
} 

oder diese

-(NSMutableArray *)read 
{ 
    NSMutableArray *dataArray = [[NSMutableArray alloc] init]; 

    //picking data from database here 

    return [dataArray autorelease]; 
} 

Sie sagen, „Leck Prüfprozess gehängt bekommen“, aber ich bin wirklich nicht sicher, was Sie damit meinen. Ob es hängt, abstürzt oder die Nationalhymne von Botswana spielt, Sie müssen das zurückgegebene Array definitiv freigeben, und jedes andere Problem ist ein anderes Problem. Möglicherweise vergessen Sie, die Daten an anderer Stelle zu speichern.

+0

+1 --- danke .... – Saawan

-1

Das Eigentum des zurückgegebenen Objekts kann an das Objekt zurückgegeben werden, das von dieser Funktion empfängt. Sie können einige Debugging mit dem Grafen so etwas wie dieses ...

NSLog(@"Retain count: %i", [dataArray retainCount]); 

Schalten Sie die Debug-Konsole (Command + R in Xcode) unter Verwendung behalten Objekt tun, um die NSLog Ausgabe zu sehen.

+4

Ich würde empfehlen, sich um die Zurückhaltung eines Objekts zu kümmern; Aufgrund von Dingen, auf die wir keinen Einfluss haben, ist die Retain-Anzahl aus Debugging-Sicht nicht so nützlich. Es ist da, also weiß das Objekt, wann es sich zurückziehen soll. –

+0

+1 @Jonathan ist korrekt, und sogar Apples Dokumentation für die RetainCount-Methode besagt, sie nicht zum Debuggen von Speicherverwaltungsproblemen zu verwenden. Eines der möglichen Probleme ist, dass die anhängigen Autoreleases nicht berücksichtigt werden. – dreamlax

+0

RUFEN SIE RESERVECount NICHT AUF. Nicht immer und sicher ** nicht ** für "Debugging-Zwecke". – bbum

1

Eine andere Antwort mehr ... Es gibt viele Konventionen in Kakao/Kakao-Note gibt es one von ihnen, die besagt, dass, wenn eine Methode das Präfix hat init dann werden Sie das Eigentum an diesem Objekt haben (daher haben Sie daher um sie zu entriegeln)

dies nicht der Fall ist, wenn Sie das tun:

DatabaseReader *dbReader = [[DatabaseReader alloc] init]; 
NSMutableArray *mutArray = [dbReader read]; 
[dbReader release]; 

Sie sind nicht lösen mutArray soll. ABER, das erstellte Objekt muss von jemandem freigegeben werden. So können Sie tun, wie JeremyP schrieb. alloc/init und lege es in einen Autorelease-Pool innerhalb der Implementierung der Lesemethode. Oder Sie können:

-(NSMutableArray *)read 
{ 
    NSMutableArray *dataArray = [NSMutableArray array]; 
    //IMPORTANT: 
    //Did you noticed that I am not using any method 
    //with init prefix for the creation of dataArray ? 
    //so I don't need to release by my self ;) 

    //picking data from database here 

    return dataArray; 
} 

Das ist im Grunde das Gleiche. ;)

+0

Das ist nicht ganz richtig. Besitz wird durch die Klassenmethode "alloc" erworben, nicht durch die Instanzmethode "init". Siehe die Dokumentation für NSObject [alloc] (http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html#//apple_ref/doc/uid/20000050 -alloc) Methode und beziehen Sie sich auch auf die [Speicherverwaltungsregeln] (http://developer.apple.com/library/mac/#documentation/cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html). – dreamlax