Leider schon. Denn mit "stringWithString" greifst du ja scheinbar wieder nur auf das redundante String Literal zu und bekommst die selben IDs. Bei "stringWithFormat" wird tatsächlich jeweils eine neue ID erzeugt, denn man erzeugt ja auch einen eigenen String. So war zumindest mein Gedankengang - bin ja da blutiger Anfänger. Im Test lässt es sich nachvollziehen.
NSDictionary und redundante Werte - wie kann ich die "faule" Speicherung umgehen?
-
-
Meine Meinung: Mit dem Ansatz wirst du früher oder später immer wieder auf die Nase fallen. Dictionaries mappen von key nach value, nicht andersrum - egal welche Kunststücke man anstellt. Wenn du die Parents wissen musst, musst du sie dir auf andere Weise merken, z.B. mit Verweisen von Kindern auf Parents, mit eindeutigen IDs oder sonstwie. Aber schlag' dir das Reverse Lookup aus dem Kopf, das kann nur Ärger machen.Multigrad - 360°-Produktfotografie für den Mac
-
awado schrieb:
Leider schon. Denn mit "stringWithString" greifst du ja scheinbar wieder nur auf das redundante String Literal zu und bekommst die selben IDs. Bei "stringWithFormat" wird tatsächlich jeweils eine neue ID erzeugt, denn man erzeugt ja auch einen eigenen String. So war zumindest mein Gedankengang - bin ja da blutiger Anfänger. Im Test lässt es sich nachvollziehen.
nein eben nicht, wenn du einen MUTABLE-string erstellst bekommst du auch ein neues objekt mit neuer adresse (was du als ID bezeichnest)!
NSString *s = @"test";
NSString *s1 = [NSString stringWithString:@"test"];
NSString *s2 = [NSMutableString stringWithString:@"test"];
NSLog(@"s: %p", s);
NSLog(@"s1: %p", s1);
NSLog(@"s2: %p", s2); -
stringWithString: ist eine der überflüssigsten Methoden überhaupt. copy und mutableCopy reichen doch vollkommen aus.
„Meine Komplikation hatte eine Komplikation.“ -
macmoonshine schrieb:
stringWithString: ist eine der überflüssigsten Methoden überhaupt. copy und mutableCopy reichen doch vollkommen aus.
Aber erst, seit es ARC gibt.
Michael -
Ach, das kleine autorelease tippt sich ja schon fast von alleine
„Meine Komplikation hatte eine Komplikation.“ -
macmoonshine schrieb:
stringWithString: ist eine der überflüssigsten Methoden überhaupt. copy und mutableCopy reichen doch vollkommen aus.
für NSString ist die methode sinnlos, für NSMutableString aber nicht! copy macht ganz was anderes und bei mutablecopy musste noch autorelease hinten dran (jaja, ARC - es gibt aber nicht nur ARC...) -
ich glaube das Problem liegt viel früher: Nämlich schon bei dem Konzeption der Schnittstelle bzw. API. Währe diese sauber müsste man nichts verbiegen.
-
Kismet schrieb:
ich glaube das Problem liegt viel früher: Nämlich schon bei dem Konzeption der Schnittstelle bzw. API. Währe diese sauber müsste man nichts verbiegen.
Danke, das ist exakt der Punkt.Multigrad - 360°-Produktfotografie für den Mac -
gritsch schrieb:
macmoonshine schrieb:
stringWithString: ist eine der überflüssigsten Methoden überhaupt. copy und mutableCopy reichen doch vollkommen aus.
für NSString ist die methode sinnlos, für NSMutableString aber nicht! copy macht ganz was anderes und bei mutablecopy musste noch autorelease hinten dran (jaja, ARC - es gibt aber nicht nur ARC...)
Ich habe auch nicht behauptet, dass das Eins-Zu-Eins-Ersetzungen sind. Man muss natürlich dabei wissen, was man macht. Ich finde an stringWithString: problematisch, dass sie den Neuling in der Regel auf die falsche Fährte bringt.
„Meine Komplikation hatte eine Komplikation.“ -
macmoonshine schrieb:
gritsch schrieb:
macmoonshine schrieb:
stringWithString: ist eine der überflüssigsten Methoden überhaupt. copy und mutableCopy reichen doch vollkommen aus.
für NSString ist die methode sinnlos, für NSMutableString aber nicht! copy macht ganz was anderes und bei mutablecopy musste noch autorelease hinten dran (jaja, ARC - es gibt aber nicht nur ARC...)
Ich habe auch nicht behauptet, dass das Eins-Zu-Eins-Ersetzungen sind. Man muss natürlich dabei wissen, was man macht. Ich finde an stringWithString: problematisch, dass sie den Neuling in der Regel auf die falsche Fährte bringt.
warum? sind dann deiner meinung nach auch dataWithData, arrayWithArray, setWithSet etc auch sinnlos? -
Ja, ich finde copy und mutableCopy wesentlich aussagekräftiger.„Meine Komplikation hatte eine Komplikation.“
-
macmoonshine schrieb:
Ja, ich finde copy und mutableCopy wesentlich aussagekräftiger.
mutableCopy] autorelease] bzw release wohlgemerkt - und das finde ich weder leserlicher/verständlciher noch sonstwas (und beim umstieg auf ARC muss man das behandeln, stringWithString jedoch nicht) -
gritsch schrieb:
(und beim umstieg auf ARC muss man das behandeln, stringWithString jedoch nicht)
Das macht doch das Xcode-Refactoring für Dich.
„Meine Komplikation hatte eine Komplikation.“ -
macmoonshine schrieb:
gritsch schrieb:
(und beim umstieg auf ARC muss man das behandeln, stringWithString jedoch nicht)
Das macht doch das Xcode-Refactoring für Dich.
komisch dass ich einem programm nicht traue welches dauernd abstürzt und sich teilweise wie software in alpha-version anfühlt...
warum auf irgendwas vertrauen wenn es genau dafür eine methode gibt? -
gritsch schrieb:
warum auf irgendwas vertrauen wenn es genau dafür eine methode gibt?
+lol+
Also wieder zurück zu vi, make und gcc!
„Meine Komplikation hatte eine Komplikation.“ -
macmoonshine schrieb:
gritsch schrieb:
warum auf irgendwas vertrauen wenn es genau dafür eine methode gibt?
+lol+
Also wieder zurück zu vi, make und gcc!
warum? -
gritsch schrieb:
macmoonshine schrieb:
gritsch schrieb:
macmoonshine schrieb:
stringWithString: ist eine der überflüssigsten Methoden überhaupt. copy und mutableCopy reichen doch vollkommen aus. ;)
für NSString ist die methode sinnlos, für NSMutableString aber nicht! copy macht ganz was anderes und bei mutablecopy musste noch autorelease hinten dran (jaja, ARC - es gibt aber nicht nur ARC...)
Ich habe auch nicht behauptet, dass das Eins-Zu-Eins-Ersetzungen sind. Man muss natürlich dabei wissen, was man macht. Ich finde an stringWithString: problematisch, dass sie den Neuling in der Regel auf die falsche Fährte bringt. ;)
warum? sind dann deiner meinung nach auch dataWithData, arrayWithArray, setWithSet etc auch sinnlos?
-klasseWithKlasse: sind zu einer Zeit entstanden, zu der es noch kein ARC gab. Sie sind meinetwegen mehr oder weniger aussagekräftig als -copy und mutableCopy, aber für MRC sind sie bequemer. In Zeiten von ARC haben sie ziemlich viel ihres Charmes verloren.
Dasselbe gilt übrigens für die übrigen CA und new-Allocatoren. In ARC-Code schreibe ich meistens einen new-Allocator, keinen CA.
Negm-Awad, Objective-C und Cocoa, Band I, S. 281
Convenience-Copy
Für die manuelle Speicherverwaltung existieren wieder Bequemlichkeitsmethoden. Deren Vorteil erhellt sich ebenso wie der Vorteil der Convenience-Allocators gegenüber new-Methoden erst im Kapitel über manuelle Speicherverwaltung. Sie sind bei automatischer Speicherverwaltung auch wieder buchstabengleich.
Diese Methoden haben den Namen +klasseWithKlasse:, also etwa +instrumentWithInstrument:, wobei das Original als Parameter übergeben wird.
Bei automatischer Speicherverwaltung bietet sich aber copy an.Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Amin Negm-Awad ()
-
gritsch schrieb:
macmoonshine schrieb:
gritsch schrieb:
(und beim umstieg auf ARC muss man das behandeln, stringWithString jedoch nicht)
Das macht doch das Xcode-Refactoring für Dich.
komisch dass ich einem programm nicht traue welches dauernd abstürzt und sich teilweise wie software in alpha-version anfühlt...
warum auf irgendwas vertrauen wenn es genau dafür eine methode gibt?
Wann hast du dir das letzte mal Xcode 4 angeschaut?^^ -
Amin Negm-Awad schrieb:
-klasseWithKlasse: sind zu einer Zeit entstanden, zu der es noch kein ARC gab. Sie sind meinetwegen mehr oder weniger aussagekräftig als -copy und mutableCopy, aber für MRC sind sie bequemer. In Zeiten von ARC haben sie ziemlich viel ihres Charmes verloren.
Dasselbe gilt übrigens für die übrigen CA und new-Allocatoren. In ARC-Code schreibe ich meistens einen new-Allocator, keinen CA.
Wenn ich mir es recht überlege, brauche ich auch nur sehr selten eine explizite Kopie eines Objekts. Meistens geschieht das Erzeugen einer unveränderlichen Kopie bei mir implizit über Propertys mit der Eigenschaft copy. Bei veränderbaren Kopien erzeuge ich meistens ein leeres Objekt und fülle es mit den gewünschten Daten.„Meine Komplikation hatte eine Komplikation.“