2009-03-03 10 views
1

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?

Antwort

6

Wenn Sie Ihre UIActionSheet erstellen, geben Sie ihm einen Tag:

actionSheet.tag = 1; // or 2 or 3 or ... 

in Ihrem Delegatmethode Dann wird der Schalter, auf dem Tag basiert das Verhalten des jeweiligen Blattes zu bestimmen.

+0

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. –

+0

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

+0

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. –