Frage

Ich habe gelesen, dass nicht änderbare Datentypen können nicht einmal erstellt geändert werden. (ZB NSString oder NSArray).

Aber können sie neu initialisiert auf einen anderen Satz von Objekten zu Punkt werden?

Wenn ja, muss ich Release verwenden zwischen den Anwendungen jede alloc aus beim ersten Mal zu befreien? zB:

myArray als NSArray * myArray in Schnittstelle deklariert, und als die nicht-atomare / behalten property.myArray Satz in Initialisierungscode zu einem Punkt zu einem Array von Strings wie folgt.

self.myArray = [myString componentsSeparatedByString:@","];

Aber später möchte ich reinitialisieren myArray Punkt zu einem anderen Satz von Zeichenketten

self.myArray = [myOtherString componentsSeparatedByString:@","];

Ist es möglich? Dank ...

War es hilfreich?

Lösung

Ja können Sie die NSArray neu initialisiert. Hier ist der Beispielcode, die ich verwendet, um neu initialisiert die NSArray.

NSString *keywords = @"FirstName|LastName|Address|PhoneNumber";
NSArray *arr = [keywords componentsSeparatedByString:@"|"];
NSLog(@"First Init - %@,%@,%@,%@",[arr objectAtIndex:0],[arr objectAtIndex:1],
                                  [arr objectAtIndex:2],[arr objectAtIndex:3]);
arr = nil;

keywords = @"First_Name|Last_Name|_Address|_PhoneNumber";
arr = [keywords componentsSeparatedByString:@"|"];
NSLog(@"Second Init - %@,%@,%@,%@",[arr objectAtIndex:0],[arr objectAtIndex:1],
                                   [arr objectAtIndex:2],[arr objectAtIndex:3]);

Andere Tipps

Es hängt wirklich, was du meinst mit re-initialize . Sie können zuweisen andere unveränderliches Objekt auf einen Zeiger, weil die Zeiger nicht konstant sind.

Beispiel:

@interface MyObj : NSObject {
    NSString *name;                    // not needed in 64bit runtime AFAIK
}
@property(retain) NSString *name;      // sane people use copy instead of retain
                                       // whenever possible. Using retain can
                                       // lead to some hard to find errors.
@end

/* ... another file ... */

MyObj *theObject = [[[MyObj alloc] init] autorelease];

theObject.name = @"Peter";
NSString *oldName = theObject.name;

NSLog(@"%@", theObject.name);   // -> Peter
NSLog(@"%@", oldName);          // -> Peter

theObject.name = @"Martin";
NSLog(@"%@", theObject.name)    // -> Martin
NSLog(@"%@", oldName)           // -> Peter

Wenn das Verhalten oben ist, was Sie wollen, das ist in Ordnung.

Wenn Sie diese letzte Zeile zurückkehren wollen Martin Sie sind in Schwierigkeiten. Das sind konstante Strings und sind nicht gemeint geändert werden . Sie könnten, wenn Sie wirklich wollen, die Erinnerung an die direkt Objekt ändern, aber das ist gefährlich und nicht zu empfehlen. Verwenden Sie veränderbare Objekte, wenn Sie ein solches Verhalten benötigen.

Natürlich können sie. Zu sagen, dass ein NSArray ist unveränderlich bedeutet nicht, dass ein Attribut einer Klasse dieser Art nicht geändert werden kann. Sie können den Inhalt nicht ändern, aber Sie können neue Inhalte zuweisen.

Wenn Sie auch machen die Änderung der Referenz unmöglich sollten Sie const Schlüsselwort verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top