Die korrekte Art und Weise UIActionSheet Delegierten zu benutzen? Pointers Mapped auf identische Speicher
Frage
Ich bin mit dem actionSheet Variable übergeben von actionSheet: didDismissWithButtonIndex: der anruf actionSheet auf eine Liste von UIActionSheet Variablen in meiner Klasse zu vergleichen. Dies scheint die Art und Weise der Delegatmethode zwischen den Ereignissen zu unterscheiden konzipiert zu sein.
- (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, ich Alloc eine Instanz von UIActionSheet einem der Klassenvariablen, stellen Sie die Anzeigeeigenschaften, zeigen Sie es und lassen Sie sie .
Das funktioniert reibungslos, auf den ersten. Das Problem ist, dass für eine Weile nach dem Laufen, schließlich beide UIActionSheet Zeiger (Klassenvariablen actionSheet1 & actionSheet2 im Codebeispiel oben) auf den gleichen Speicher zeigt am Ende, je nachdem, was zur Laufzeit geschieht, wodurch beide, wenn Aussagen in den Delegaten Verfahren zur Bewertung wahr. Nicht gut.
Nun, wenn ich pro Lauf jedes UIActionSheet nur einmal Alloc waren und halten an dem Speicher (nie Release nennen), sollte dies nicht passieren. Aber ich versuche, hier konservativ. Übernimmt Apple beabsichtigt, dass die Delegierten auf diese Weise verwendet werden?
Lösung
Wenn Sie Ihre UIActionSheet erstellen, geben Sie ihm einen Tag:
actionSheet.tag = 1; // or 2 or 3 or ...
Dann in Ihrem Delegatmethode, wird der Schalter auf dem Tag basiert das Verhalten des jeweiligen Blattes zu bestimmen.