2010-01-16 7 views
11

Ich habe immer noch etwas unklar über die Freigabe und Autorelease. Was ist der Unterschied zwischen beiden? Ich habe diesen Code. Für Facebook Verbindung. Ich stürze es manchmal ab, wenn ich auf Facebook login gehe, ich bezweifle es vielleicht, weil ich das Objekt nicht schön loslasse. Vielen Dank für jede hilftWas ist der Unterschied zwischen Freigabe und Autoreleasing?

if (_session.isConnected) { 
     [_session logout]; 
    } else { 
     FBLoginDialog* dialog = [[[FBLoginDialog alloc] initWithSession:_session] autorelease]; 
     [dialog show]; 
    } 

Antwort

20

Die Memory Management Programming Guide for Cocoa wird in Kürze Ihr bester Freund sein. Kurz gesagt, Objektinstanzen in Cocoa sind Speicher, die durch Referenzzählung verwaltet werden (es sei denn, Sie verwenden die Garbage Collection unter OS X). Ein Objekt gibt an, dass es eine Eigentumsrechte an einer anderen Instanz "behalten" möchte - verhindern Sie, dass es freigegeben wird -, indem Sie ihm eine Nachricht senden, die eine -retain Nachricht enthält. Ein Objekt gibt an, dass es dieses Interesse freigeben möchte, indem es der anderen Instanz eine -release Nachricht sendet. Wenn die Anzahl der Objekte, die "beibehalten" haben und Eigentumsrechte an einem Objekt betreffen, auf 0 fällt (d. H. Wenn die letzte der besitzenden Instanzen eine -release Nachricht sendet), wird die Instanz mit einer Anzahl von 0 Zurückbehalten freigegeben.

Manchmal ist es bequem zu sagen "Ich möchte, dass diese Instanz freigegeben wird einige Zeit in der Zukunft". Das ist der Zweck von -autorelease. Das Senden einer Nachricht fügt den Empfänger dem aktuellen NSAutoreleasePool hinzu. Wenn dieser Pool leer ist, sendet er eine -release Nachricht an alle Instanzen im Pool. Ein NSAutoreleasePool wird automatisch zu Beginn jeder Iteration der Laufschleife jedes Threads erstellt und am Ende dieser Iteration abgelassen. So können Sie so etwas wie dies in einem Verfahren tun:

- (id)myMethod { 
    return [[[MyObject alloc] init] autorelease]; 
} 

Der Aufrufer dieser Methode wird eine Instanz zurück, dass sie -retain, wenn sie es behalten wollen. Wenn sie es nicht behalten, wird es zumindest bis der umschließenden Autofreigabepool bleiben, um abgelassen wird:

- (void)someOtherMethod { 
... 

id instance = [obj myMethod]; 
... // do more with instance, knowing that it won't be dealloc'd until after someOtherMethod returns 

} 
+0

Der Link zum Speicherverwaltungsprogramm scheint unterbrochen zu sein; Die iOS-Version finden Sie jetzt unter https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html – CCJ

3

Nach den Memory Management Programming Guide for Cocoa:

Das Autofreigabeverfahren, definiert durch NSObject, markiert den Empfänger für spätere Release. Durch Autoreleasing eines Objekts - dh durch Senden einer Autorelease-Nachricht - erklären Sie, dass Sie das Objekt nicht besitzen wollen über den Bereich hinaus, in dem Sie Autorelease gesendet haben.

auch:

Der Autofreigabeverfahren ermöglicht somit jedes Objekt andere Objekte verwenden ohne sich Gedanken über die Entsorgung von sie.

4

Hintergrund Diskussion:

Objective-C wird Bezug gezählt, so Objekte gelöscht werden, wenn die Referenz Zählung erreicht 0.Release reduziert die Referenzzählung sofort, Autofreigabe reduziert, wenn der Autofreigabe-Pool

geknallt wird, wenn zu verwenden:

Verwendung Autorelease, wenn das Objekt Zuweisung wenn

  • Sie es nicht brauchen, nachdem die Aktuelle Funktion
  • Es wird durch ein anderes Objekt/Funktion reatiniert und wird durch einen späteren Code
  • freigegeben werden, wenn die Logik der aktuellen Funktion ist schwierig, so dass Sie die Freigabe senden müssten in einem Dutzend verschiedenen Orten, bevor eine Rückkehr

Verwendung „Handbuch“ release tun

  • eine frühere behalten zurückzukehren (falls Sie eine Bibliothek implementieren)
  • , wenn Sie eine genaue Kontrolle zu befreien müssen Objekte (z sie verwenden viel Speicher oder der Autofreigabepool wird nicht für einige Zeit)

aber wirklich meine freand geknallt werden:

  • die Memory Management Programming Guide for Cocoa wie von Barry und führen Sie Ihren Code mit Instrumenten (Zombies vorgeschlagen lesen und Lecks) häufig, um irgendwelche und fast alle Speicherverwaltungsfehler zu erfassen.

Erik

7

Mittel Loslassen Loslassen, dass sofort. Autoreleasing bedeutet, dass die Variable im nächsten Autorelease-Pool freigegeben werden soll.

Sie verwenden die automatische Freigabe, wenn Sie die Variable beibehalten, aber kein Speicherleck erstellen möchten. Sie verwenden Release, wenn Sie die Variable nicht mehr benötigen.

Probe:

- (NSNumber *)return5 { 
    NSNumber * result = [[NSNumber alloc]initWitnInt: 5]; 
    [result autorelease]; 
    return result; 
} 

Warum verwenden wir Autofreigabe da?

Wenn wir stattdessen [result release] verwenden, wird das variable Ergebnis zu diesem Zeitpunkt zerstört. Das bedeutet, dass der zurückgegebene Wert unbrauchbar ist.

Wenn wir überhaupt nicht freigeben, wird die Variable result für FOREVER gehalten werden Speicherverlust.

Wir können jedem Anrufer die Funktion mitteilen, das Ergebnis freizugeben, aber das wäre ein Kopfzerbrechen und fehleranfällig.

So verwenden wir Autorelease. Wir markieren die Variable, die im nächsten Autorelease-Pool freigegeben werden soll. Grundsätzlich markieren wir die Variable, die in der Nähe des Alloc freigegeben werden soll. Daher wird das Mantra-Alloc mit der Freigabe in der gleichen Funktion gepaart, die die ganze Zeit hält.

Eigentlich werden Sie alle Freigabe in AutoRelease ändern. Ihr Speicherverbrauch ist nicht effizient, jedoch ist der Effekt minimal. Alle Variablen sind in jeder Programmiersprache effektiv freigegeben.

Wie auch immer, verwenden Sie ARC.

Verwandte Themen