/ / Beim Freigeben eines Objekts gehören zu einem anderen Objekt - Xcode-Speicherverwaltung - Ziel-C, Kakao, Xcode, Speicherverwaltung

Auf freigebende Objekte gehören zu einem anderen Objekt - xcode Speicherverwaltung - Ziel-c, Kakao, xcode, Speicherverwaltung

Ist [[MyObject itemProperty] release] akzeptabel?

Derzeit habe ich MyObject, das einige Daten abruft undsetzt es auf itemProperty. Der Delegat von MyObject wird dann ausgelöst und verwendet die itemProperty-Daten von MyObject und gibt sie frei. Ist dies eine akzeptable Methode zur Speicherverwaltung?

Aus verschiedenen Büchern wurde mir gesagt, dass Sie nur ein Objekt freigeben sollten, das Sie deklarieren. Irgendwelche Tipps oder alternative Wege?

Antworten:

2 für die Antwort № 1

Ich würde gegen den Ansatz empfehlen, den Sie beschreiben ... Ihr Instinkt, auf SO eine Frage zu stellen, ist richtig, da dies wahrscheinlich zu Problemen führen wird.

Objekte sind für die Verwaltung ihrer eigenen Objekte verantwortlichDer interne Zustand und die Tatsache, dass ein Delegierter auf diese Weise in diesen internen Zustand eingreift, ist ziemlich ungewöhnlich. Die normale Praxis zum Bereinigen des Speichers ist zu haben MyObject Speicher in seiner freigeben dealloc Methode:

- (void)dealloc {
[item release];
[super dealloc];
}

In der Tat, wenn Sie implementieren dealloc wie du aufräumen solltest MyObjectLassen Sie den Delegierten eine Freigabemeldung an das Objekt senden itemProperty wird bedeuten, dass die itemProperty Objekte werden zweimal freigegeben, wodurch sie verlassen werdenitemProperty behält die Anzahl in einem unerwarteten Zustand bei und kann dazu führen, dass die Zuordnung vorzeitig aufgehoben wird. Wenn Sie die App jemals so ändern, dass andere Objekte itemProperty verwenden, werden sie nach dem Aufruf des Delegaten auf mysteriöse Weise freigegeben.

Auf der anderen Seite, wenn Sie den Speicher nicht aufräumen deallocSie geraten in eine Situation, in der Sie sich verlassenwenn der Delegat aufgerufen wird, um sicherzustellen, dass der Speicher ordnungsgemäß verwaltet wird. Können Sie wirklich garantieren, dass die Delegatenmethode IMMER irgendwann in Ihrer App aufgerufen wird? Ohne Fehler? Auch wenn es Ausnahmen oder andere Fehlerbedingungen gibt, die einen ungewöhnlichen Ausführungsfluss für Ihre Anwendung verursachen können?

Auch wenn Sie dies als App-Logik garantieren könnenÄnderungen, dies ist möglicherweise nicht mehr der Fall und Sie werden vergessen, dass der Delegat die Speicherverwaltung durchführt, was zu einem Leck oder einem Segfault führt. Sicherlich würden andere Kakaoentwickler, die Ihren Code verwalten, nicht daran denken, den Delegaten für die Speicherverwaltung zu betrachten und würde wahrscheinlich Schwierigkeiten haben, auftretende Probleme zu beheben.

In diesem Fall muss der Delegat nur die verwenden itemProperty ohne es zu behalten, freizugeben oder automatisch freizugeben(es sei denn, der Delegat muss natürlich sicherstellen, dass die itemProperty auch dann noch verfügbar ist, wenn MyObject möglicherweise nicht mehr vorhanden ist.) Wenn die Zuordnung von MyObject aufgehoben wird, werden die itemProperty-Daten freigegeben.


0 für die Antwort № 2

Im Allgemeinen geben Sie nur frei, wenn Sie etwas zuweisen, neu oder kopieren. Da Sie außer der Freigabe keinen anderen Code bereitgestellt haben, ist es schwer zu sagen, ob Sie freigeben sollten oder nicht.

Nach dem, was Sie gesagt haben, scheint die beste Lösung zu seinunter Verwendung eines Autorelease-Pools. Rufen Sie nach dem Abrufen Ihrer Daten MyObject auf [itemProperty autorelease]. Dann wird es automatisch freigegeben, nachdem Ihr Delegat es verwendet hat. Es kommt aber darauf an, wie du das alles machst :-)

Auch hier hilft mehr Code.


0 für die Antwort № 3

Erstens deklarieren Sie kein Objekt. Ihre Objekte erstellen andere Objekte, besitzen sie, geben sie weiter usw.

Geben Sie niemals etwas frei, das Sie nicht besitzen. Das Freigeben eines Objekts bedeutet "Ich möchte dieses Objekt nicht mehr besitzen". Wenn Sie es bereits nicht besitzen, worauf geben Sie dann auf? Erwarten Sie einen Bruch, wenn Sie so ein schlechtes Mojo machen.

Wenn Sie möchten, dass der aktuelle Eigentümer es nicht mehr besitzt, teilen Sie es ihm mit. Im Allgemeinen wird dies so etwas wie sein [myObject setItemProperty:nil] (oder myObject.itemProperty = nil). Oder Sie könnten ein neues Objekt liefern. In jedem Fall liegt es in der Verantwortung des derzeitigen Eigentümers, den Besitz einzustellen.