Ich verwende die actionSheet-Variable, die von actionSheet übergeben wird: didDismissWithButtonIndex: um das aufrufende actionSheet mit einer Liste von UIActionSheet-Variablen in meiner Klasse zu vergleichen. Dies scheint die Methode zu sein, mit der die Delegate-Methode Ereignisse unterscheiden kann.Richtiger Weg UIActionSheet Delegate zu benutzen? Zeiger auf identischen Speicher zugeordnet
- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex {
if (actionSheet == actionSheet1) {
switch (buttonIndex) {
case 0:
// Do Something
break;
case 1:
// Do Something Else
break;
case 2:
// Cancel
break;
}
}
if (actionSheet == actionSheet2) {
switch (buttonIndex) {
case 0:
// Do Something
break;
case 1:
// Do Something Else
break;
case 2:
// Cancel
break;
}
}
}
Jedes Mal, wenn ein UIActionSheet angezeigt wird, Alloc I eine Instanz von UIActionSheet einem der Klassenvariablen, stellen die Anzeigeeigenschaften, zeigt es, und lassen Sie ihn.
Dies funktioniert zunächst reibungslos. Das Problem ist, dass nach dem Ausführen für eine Weile schließlich beide UIActionSheet-Zeiger (Klassenvariablen actionSheet1 & actionSheet2 im obigen Codebeispiel) auf den gleichen Speicher zeigen, abhängig davon, was zur Laufzeit passiert, wodurch beide if-Anweisungen im Delegaten verursacht werden Methode, um wahr zu bewerten. Nicht gut.
Nun, wenn ich jedes UIActionSheet nur einmal pro Lauf zuweisen und auf den Speicher halten sollte (nie Release aufrufen), sollte dies nicht passieren. Aber ich versuche hier konservativ zu sein. Plant Apple, den Delegierten auf diese Weise zu nutzen?
Verzeihen Sie mir, aber würde dies nicht vollständig funktionieren, wenn das UIActionSheet in meinem Code veröffentlicht worden wäre? Oder behält die UIActionSheet-Klasse die Instanz, bis der Delegat aufgerufen wird? Ich denke, das würde Sinn machen, aber ich kann es nicht sagen. –
Sie verstehen Speicherverwaltung nicht. Wenn es die Delegate-Methode erreicht, handelt es sich um ein Objekt mit Autorelease, das jedoch weiterhin existiert und Sie können alles tun, was Sie benötigen. Die Tatsache, dass die Delegate-Methode Ihnen den actionSheet-Zeiger gibt, sollte Ihnen sagen, dass sie existiert, anderenfalls, warum sie einbeziehen? – August
In Ordnung, das macht Sinn. Da der einzige Autorelease-Pool, den ich sehe, in main() ist, wann gibt dieser Pool tatsächlich seine Objekte frei? Sie können sehen, wohin ich damit gehe: Welche Methode wird das Gedächtnis auf die aggressivste Art und Weise freisetzen? Ich nehme an, diese Methode wäre dann die "beste" Praxis. –