it-swarm.com.de

Ziel C - Wertübergabe und Referenzübergabe

Zunächst einmal entschuldige ich mich für diese einfache Frage. Aber ich muss verstehen, was passiert.

Ich dachte, die Ausgabe sollteupper case stringsein. Aber es kommt heraus, dass esUPPER CASE STRINGist.

- (void)test
{
     NSString *stringVar = @"UPPER CASE STRING";
     [self changeString:stringVar];
     NSLog(@"value after changed : %@", stringVar);
}

- (void)changeString:(NSString*)string
{
     string = [string lowercaseString];
}

Was passiert und wie kann ich das beheben?

24

Der Aufruf [string lowercaseString] erstellt ein new NSString-Objekt, das Sie der lokalen Variablen string zuweisen. Der Wert von stringVar außerhalb der changeString-Funktion wird dadurch nicht geändert. Der Zeiger selbst wird als Wert übergeben.

Eine Möglichkeit, das zu tun, was Sie möchten, besteht darin, einen Zeiger auf einen Zeiger zu übergeben:

-(void) test
{
     NSString *stringVar = @"UPPER CASE STRING";
     [self changeString:&stringVar];
     NSLog(@"value after changed : %@", stringVar);
}

-(void) changeString:(NSString**)string
{
     *string = [*string lowercaseString];
}
58
Greg Hewgill

Wenn Sie den Verweis auf die [NSString lowerCaseString]Methode betrachten, können Sie sehen, dass eine neue Zeichenfolge mit den Kleinbuchstaben zurückgegeben wird:

Gibt eine untergeordnete Darstellung des Empfängers zurück.

- (NSString *)lowercaseString

Ihr Code überschreibt einfach den Verweis auf die Eingabezeichenfolge mit der Ausgabe des Aufrufs lowercaseString, was keine Auswirkung hat. Der beste Weg zur Lösung dieses Problems besteht darin, dass Sie den Wert selbst zurückgeben, wodurch die Methode verständlicher wird:

-(void) test
{
     NSString *stringVar = @"UPPER CASE STRING";
     stringVar = [self changeString:stringVar];
     NSLog(@"value after changed : %@", stringVar);
}

-(NSString *) changeString:(NSString*)string
{
     string = [string lowercaseString];
     return string;
}

Sie müssen verstehen, dass NSString unveränderlich ist. Es gibt also keine andere Möglichkeit, als den Verweis neu zuzuweisen, um den Inhalt eines Strings zu ändern. Sie können jedoch stattdessen NSMutableString verwenden, das an Ort und Stelle geändert werden kann.

7
trojanfoe

Ich beziehe mich auf das oben genannte Problem und helfe Ihnen mit dem Fehler

- (void)test
{
     NSString *stringVar = @"UPPER CASE STRING";
     //StringVar is a pointer to integer class.let us assume the address the stringVar be 0x50 and the value it has be 0x100
     //So 0x100 has the string 

     [self changeString:stringVar];
     //above we are calling the method to lowercase and argument is stringVar
     //As the method is called we pass 0x100 in the argument as this is the memory where the value is kept

     NSLog(@"value after changed : %@", stringVar);
    //Our StringVar still points to 0x100 where the value is in upperString
}

- (void)changeString:(NSString*)string
{
     string = [string lowercaseString];
    // Now operation performed on string returns a new value on suppose location 0x200
   //String parameter passed in argument is assigned the new value.But we never pass values as we pass only location under the hood
   //New parameter passed now points to new memory location 0x200

}

---------------------------------------------------------------------------------
With the new solution
-(void) test
{
     NSString *stringVar = @"UPPER CASE STRING";
     //let 0x50 be stringVar memorylocation pointing to 0x100 with above value
     [self changeString:&stringVar];
     //0x50 is passed in argument
     NSLog(@"value after changed : %@", stringVar);
     //On new location stored in address of stringVar it points to new string value
}

-(void) changeString:(NSString**)string
{
     *string = [*string lowercaseString];
     //0x200 is new memory location received.*string gives the 0x100 location and hence the value
   //LHS is assigned to new location .On LHS you find *string which will be assigned 0x200
   //As string with location 0x50 is value 0x200 which will make it to point new      location where lowercase string exist
}
1

zeichenfolge in -(void) changeString:(NSString*)string ist lokale Variable. Ändern Sie die Methode, um den Wert zurückzugeben:

-(void) test
{
     NSString *stringVar = @"UPPER CASE STRING";
     stringVar =[self changeString:stringVar];
     NSLog(@"value after changed : %@", stringVar);
}
-(NSString *) changeString:(NSString*)string
{
    return [string lowercaseString];
}
0
mas'an

string ist eine lokale Variable (ein Zeiger auf einen NSString, der unveränderlich ist). Sie ändern lediglich die stringPunkte in der lokalen Funktion, aber wenn Sie zurückkehren, wird der Wert verworfen.

Möglicherweise möchten Sie die Zeichenfolge einfach als Parameter übergeben und die Kleinbuchstabenzeichenfolge aus der Funktion zurückgeben.

0