Charith Nidarsha Charith Nidarsha - 1 month ago 15
iOS Question

Objective C - Pass by value and pass by reference

First of all, sorry for this simple question. But I need to understand what is happening.

I thought the output should be

upper case string
. But it comes out to be
UPPER CASE STRING
.

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

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


What is happening and how to fix it?

Answer

The [string lowercaseString] call creates a new NSString object that you assign to the local variable string. This does not change the value of stringVar outside the changeString function. The pointer itself is passed by value.

One way to do what you want, is to pass a pointer to a pointer:

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

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