2009-05-21 8 views
5

Im ziemlich neu zu objective-c Programmierung und Freigabe von Objekten ist meine größte Kopfschmerzen. Ich zweifle immer daran, was veröffentlicht werden muss, und meine Zeit habe ich die falsche Variable loslassen und einen BAD EXEC Absturz bekommen. Ich habe Apfels Anleitung zur Speicherverwaltung gelesen, aber ich kann nicht immer von ihren Beispielen zu meinem Code gehen.Objective-C Freisetzung von Singletons

Eine dieser Situationen ist meine Singletons (Ich bin ein großer Singleton Typ).

Ich habe eine wie folgt definieren:

static Configuration* _instance; 

+(Configuration*)getInstance{ 
    if (_instance == NULL){ 
     _instance = [Configuration alloc]; 
     [_instance initConfig]; 
    } 
    return _instance; 
} 

In meinem Code ich es wie folgt verwendet werden:

//Store configuration  
Configuration* conf = [Configuration getInstance]; 
conf.userName = self.userName.text; 
conf.cellPhone = self.phoneNumber.text; 

Habe ich die "conf" Variable freigeben müssen?

Wann sollte ich _instance freigeben?

Seit ich diesen Code auf dem iPhone ausgeführt habe, was passiert mit den Vars, die ich nicht veröffentliche? beeinflussen sie die Leistung des iPhone?

Antwort

8

Wenn Sie die Konfigurationsinstanz mit "_instance = [Konfigurationszuweisung]; [_instance initConfig];" es hatte eine Retain-Zählung von eins aus dem Alloc-Aufruf. Wenn Sie conf nach "conf.cellPhone = self.phoneNumber.text;" dann würde es an diesem Punkt freigegeben werden.

Wenn Sie zum ersten Mal ein Objekt mit alloc, Copy oder mutableCopy erstellen, wird es eine Retain-Anzahl von 1 haben. Jeder zu behaltende Aufruf erhöht sich um 1. Jeder Aufruf zur Freigabe verringert sich, wenn die Zählung um 1 gehalten wird. Das Aufrufen der Autorelease bedeutet nur "Spätere Freigabe für mich". Wenn also Sicherungen und Freigaben wie Schecks sind, ist Autorelease wie ein Scheck für die Zukunft.

Ihr Code, der auf den Configuration Singleton zugreift, behält ihn nicht bei, kopiert ihn, oder kopiert ihn, sodass er ihn nicht freigeben darf.

Da Ihr Code jetzt geschrieben wird, wird das Configuration-Objekt nie veröffentlicht und wird für die gesamte Lebensdauer der Anwendungen leben, was normalerweise mit einem Singleton geschieht.

+0

könnten Sie sich das ansehen, ich denke, Sie können mir helfen http://stackoverflow.com/questions/6928028/objective-c-alloc-release-error-in-singleton-class – Spring

2

Sie müssen Ihre conf Variable nicht freigeben, da Sie sie nicht beibehalten haben.

Als Faustregel müssen Sie die Aufrufe von Methoden, die eine Retain-Zählung erhöhen, mit Methoden ausgleichen, die sie dekrementieren.

init, retain, inkrementieren Sie es, während release dekrementiert.

Die Haupt-_instance wird freigegeben, wenn die Klasse entladen wird, also denke ich, dass Sie sich nicht darum kümmern müssen.