Ich habe eine Instanz eines UITableView und eine separate Klasse, die den Delegate- und Datenquellenprotokollen folgt. Ich tue dies, wie so:Autorelease und "zuweisen" Eigenschaften in Objective-C? (Auf dem iPhone)
SubjectTableViewHandler *handler = [[[SubjectTableViewHandler alloc] init] retain];
tv.delegate = handler;
tv.dataSource = handler;
[handler autorelease];
Ich will nicht den Handler als Ivar halten, und wenn ich die retain
Anruf am Ende nehmen ab, wenn die autorelease
geschieht, wird es gesendet release
, dann zum Pool hinzugefügt, was eine EXC_BAD_ACCESS verursacht. So aktuell, behalten die Zählung:
(1) At init: 1
(2) At retain: 2
(3) delegate/datasource properties are 'assign', still 2
(4) At autorelease: 1, now in autorelease pool.
Aber dann, da die Eigenschaften ‚assign‘, werden sie nie gelöst werden, die Beibehaltungszähler wird nie 0 getroffen, und die Prozedur wird sowieso nie freigegeben werden. Gibt es einen effizienteren Weg, dies zu erreichen, als den Handler als einen Ivar zu halten und ihn in der dealloc
Methode freizugeben?
Stimme hier zu. Kämpfe nicht gegen den Rahmen. Gibt es einen bestimmten Grund, warum Sie keinen Ivar verwenden möchten? – amattn
Es war nicht sinnvoll, einen ivar zu haben, da die Variable außerhalb der Methode, die den Handler setzt, keine Verwendung hat. Die perfekte Lösung wäre, wenn die Eigenschaften der Datenquelle/des Delegaten beibehalten würden. Dann könnten sie gesetzt und freigegeben werden, und die Klasse, die sie setzt, würde sich darüber keine Sorgen mehr machen müssen. –
Ich denke, der Grund für die Zuweisung ist, dass Sie keinen Aufbewahrungszyklus erstellen. Sie erstellen häufig das Objekt, das einen Delegaten von dem Objekt übernimmt, das zum Delegaten wird. In diesem Fall möchten Sie nicht, dass das Objekt seinen Delegaten beibehält und sein Delegat das Objekt behält. –