2009-05-19 15 views
0

Also hier ist das Problem.Adressierung und Zeiger in Ziel C

Ich habe eine Methode (oder Nachricht, wie sie in Obj-C genannt werden) Ich bin in einem Zeiger auf ein Objekt übergeben.

Innerhalb dieser Methode werde ich ändern, was dieser Zeiger zeigt, und das alte Objekt freigeben. Und ich möchte, dass die Instanzvariable (die an die Methode übergeben wird) nun auf den neuen Wert verweist, der ihr zugewiesen wurde. im Grunde mit der Variable wie ein OUT-Parameter in Sprachen wie C#

-(NSDictionary *) GetListWithCommand:(NSString*) command andCache:(CachedMutableDictionary*) cache 
{ 
    CachedMutableDictionary* Dictionary = [Getfrom somesource]; 
    CachedMutableDictionary* temp = cache; 
    cache = [Dictionary retain]; 
    [temp release]; 
} 

so ich glaube betreiben i in einer Adresse-of senden müssen Referenz für die Cache-Variable und dann in der Lage sein, sich darauf beziehen sowohl auf der Adressebene oder auf Objektebene.

Es kann auch klüger/einfacher sein, eine Kopiermethode für die CachedMutableDictionary-Klasse zu erstellen.

+1

Was genau fragen Sie? Möchten Sie wissen, ob dieser Code funktioniert oder ob dies der beste Weg ist? – Tim

Antwort

1

Ja, es klingt, als ob diese Methode ein CachedMutableDictionary ** benötigt, an das der Aufrufer den Cache & übergibt. Die letzten drei Zeilen der Methode werden:

CachedMutableDictionary *temp = *cache; 
*cache = [Dictionary retain]; 
[temp release]; 

Das riecht aber lustig für mich. Woher kommt der Cache ursprünglich? Ist es immer eine Instanzvariable eines Objekts? Warum nicht einfach das Objekt übergeben?

+0

Ich stimme zu, es riecht komisch. Was ich versuche zu tun ist, zwischen zwei Quellen (einem zwischengespeicherten Plist und einer XML-Quelle) zu wählen, sowie das Dictionary in einem Objekt zu speichern, so dass ich das Wörterbuch packen kann, ohne die gleiche Entscheidung immer wieder treffen zu müssen. Ich füge das auch in meinen Code ein, also versuche ich einen großen Refactor zu vermeiden. – Bluephlame

5

Sie müssen nur hier einige Sterne hinzufügen und dort:

-(NSDictionary *) GetListWithCommand:(NSString*) command 
          andCache:(CachedMutableDictionary**) cache 
{ 
    CachedMutableDictionary* Dictionary = [Getfrom somesource]; 
    CachedMutableDictionary* temp = *cache; 
    *cache = [Dictionary retain]; 
    [temp release]; 
} 
+2

Sie sollten sicherstellen, dass der Cache nicht wirklich Null ist, bevor Sie ihn dereferenzieren. –