Objectif C – Passer par valeur et passer par reference

Tout d'abord, désolé pour cette simple question. Mais j'ai besoin de comprendre ce qui se passe.

Je pensais que la sortie devrait être une upper case ssortingng . Mais il ressort que c'est UPPER CASE STRING .

 - (void)test { NSSsortingng *ssortingngVar = @"UPPER CASE STRING"; [self changeSsortingng:ssortingngVar]; NSLog(@"value after changed : %@", ssortingngVar); } - (void)changeSsortingng:(NSSsortingng*)ssortingng { ssortingng = [ssortingng lowercaseSsortingng]; } 

Que se passe-t-il et comment y remédier?

L'appel [ssortingng lowercaseSsortingng] crée un nouvel object NSSsortingng que vous affectez à la string de variable locale. Cela ne change pas la valeur de ssortingngVar dehors de la fonction changeSsortingng . Le pointeur lui-même est passé par valeur.

Une façon de faire ce que vous voulez est de passer un pointeur sur un pointeur:

 -(void) test { NSSsortingng *ssortingngVar = @"UPPER CASE STRING"; [self changeSsortingng:&ssortingngVar]; NSLog(@"value after changed : %@", ssortingngVar); } -(void) changeSsortingng:(NSSsortingng**)ssortingng { *ssortingng = [*ssortingng lowercaseSsortingng]; } 

Si vous regardez la reference à la méthode [NSSsortingng lowerCaseSsortingng] , vous pouvez voir qu'elle renvoie une nouvelle string, avec les caractères minuscules:

Retourne la représentation en minuscule du récepteur.

 - (NSSsortingng *)lowercaseSsortingng 

Ce que votre code fait est simplement replace la reference à la string d'input avec la sortie de l'appel lowercaseSsortingng , qui n'a aucun effet. La meilleure façon de résoudre ce problème est de renvoyer la valeur vous-même, ce qui facilite la compréhension de la méthode:

 -(void) test { NSSsortingng *ssortingngVar = @"UPPER CASE STRING"; ssortingngVar = [self changeSsortingng:ssortingngVar]; NSLog(@"value after changed : %@", ssortingngVar); } -(NSSsortingng *) changeSsortingng:(NSSsortingng*)ssortingng { ssortingng = [ssortingng lowercaseSsortingng]; return ssortingng; } 

Vous devez comprendre que NSSsortingng est immuable, donc il n'y a aucun moyen, autre que la réaffectation de la reference, de modifier le contenu d'une string. Vous pouvez cependant utiliser NSMutableSsortingng place, qui peut être modifié sur place.

Je fais reference au problème donné ci-dessus et vous aider avec l'erreur. Trouver mes commentaires

 - (void)test { NSSsortingng *ssortingngVar = @"UPPER CASE STRING"; //SsortingngVar is a pointer to integer class.let us assume the address the ssortingngVar be 0x50 and the value it has be 0x100 //So 0x100 has the ssortingng [self changeSsortingng:ssortingngVar]; //above we are calling the method to lowercase and argument is ssortingngVar //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 : %@", ssortingngVar); //Our SsortingngVar still points to 0x100 where the value is in upperSsortingng } - (void)changeSsortingng:(NSSsortingng*)ssortingng { ssortingng = [ssortingng lowercaseSsortingng]; // Now operation performed on ssortingng returns a new value on suppose location 0x200 //Ssortingng 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 { NSSsortingng *ssortingngVar = @"UPPER CASE STRING"; //let 0x50 be ssortingngVar memorylocation pointing to 0x100 with above value [self changeSsortingng:&ssortingngVar]; //0x50 is passed in argument NSLog(@"value after changed : %@", ssortingngVar); //On new location stored in address of ssortingngVar it points to new ssortingng value } -(void) changeSsortingng:(NSSsortingng**)ssortingng { *ssortingng = [*ssortingng lowercaseSsortingng]; //0x200 is new memory location received.*ssortingng gives the 0x100 location and hence the value //LHS is assigned to new location .On LHS you find *ssortingng which will be assigned 0x200 //As ssortingng with location 0x50 is value 0x200 which will make it to point new location where lowercase ssortingng exist } 

ssortingng est une variable locale (un pointeur sur un NSSsortingng qui est immuable), vous changez simplement ssortingng points de ssortingng dans la fonction locale, mais quand vous returnnez, sa valeur sera rejetée.

Ce que vous pouvez faire est de simplement passer la string en tant que paramètre et renvoyer la string minuscule de la fonction.

ssortingng in -(void) changeSsortingng:(NSSsortingng*)ssortingng est une variable locale, modifier la méthode pour renvoyer la valeur:

 -(void) test { NSSsortingng *ssortingngVar = @"UPPER CASE STRING"; ssortingngVar =[self changeSsortingng:ssortingngVar]; NSLog(@"value after changed : %@", ssortingngVar); } -(NSSsortingng *) changeSsortingng:(NSSsortingng*)ssortingng { return [ssortingng lowercaseSsortingng]; }