4 Stimmen

Iphone objectiveC alloc/release Frage

Ich bin neu in der Programmiersprache ObjectiveC. Ich habe Probleme, die Syntax des Speichermanagements zu verstehen. Mein Code ist unten:

NSDate* someDate;
someDate=[[NSDate alloc] init];
Schleife
{ 
   someDate=[[NSDate alloc] init];
}

Werde ich hier einen Speicherleck haben? Oder wird das NSDate-Objekt automatisch freigegeben?

Danke

5voto

deanWombourne Punkte 37656

Wie @DavidKanarek sagt, wirst du Lecks haben.

Es gibt mehrere Möglichkeiten, diese Lecks zu beheben :

NSDate* someDate;
someDate=[NSDate date];
loop
{ 
   someDate=[NSDate date];
}

oder

NSDate* someDate=nil;
someDate=[[NSDate alloc] init];
loop
{ 
   [someDate release];
   someDate=[[NSDate alloc] init];
}

[someDate release];

Das erste ist leichter lesbarer Code, aber das zweite hält Ihren Speicherverbrauch so niedrig wie möglich. Wenn Ihre Schleife nicht zu groß ist, verwenden Sie die erste. Wenn Sie die Schleife Tausende Male durchlaufen, würde ich die zweite verwenden.

Sam

4voto

David Kanarek Punkte 12533

Sie werden viele Speicherlecks haben. Objekte werden zunächst behalten (nicht autoreleased), wenn sie von Methoden zurückgegeben werden, die new, alloc oder copy im Namen haben. [NSDate date] würde autoreleased werden. Wenn Sie mehr substantiellen Code posten, kann ich Ihnen bei der sauberen Umsetzung Ihres Ziels helfen.

Schauen Sie sich auch Apples Memory Management Guide an.

1voto

Vivek Gajbe Punkte 382

Dieses Objektbesitzschema wird durch ein Referenzzählsystem implementiert, das intern verfolgt, wie viele Besitzer jedes Objekt hat. Wenn Sie den Besitz eines Objekts beanspruchen, erhöhen Sie seinen Referenzzähler, und wenn Sie mit dem Objekt fertig sind, verringern Sie seinen Referenzzähler. Solange sein Referenzzähler größer als Null ist, ist garantiert, dass ein Objekt existiert, aber sobald der Zähler Null erreicht, darf das Betriebssystem es zerstören.

http://rypress.com/tutorials/objective-c/memory-management

Aber in der neuesten xcode bietet es ARC (Automatische Referenzzählung).
Daher wird der Referenzzähler automatisch verwaltet. Wenn eine Klasse dealloziert wird, gibt sie den Speicher für alle Objekte frei, die sie enthält.

0voto

wei Punkte 3937

Du wirst viele Memory Leaks haben.

someDate ist eine Zeiger-Variable und wird einem Speicherblock zugewiesen, den du reservierst, in diesem Fall ist es [[NSDate alloc] init].

In der Schleife weist du jedoch deiner Zeiger-Variable einen anderen Speicherblock zu (someDate=[NSDate date]).

Der Speicherleck tritt auf, da diese bereits reservierten Speicherblöcke nicht freigegeben wurden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X