Saturday, June 27, 2015

Attempt to mutate immutable object with appendString - ObjectiveC


"Attempt to mutate immutable object with appendString" is one of the most common error while doing iOS development. This will occur due to mutability of the NSString. Lets check in detail.
As most of you know foundation framework has two types of strings

  • NSString   (not modifiable)
  • NSMutableString (can modify)

Basing on these strings, we can have below two scenarios.

1. We can assign NSMutableString to NSString
2. We can't assign NSString to NSMutableString

Scenario #1 is perfectly valid, because NSMutableString is a subclass of NSString. But scenario #2 will crash the application and throws below error message.

"Attempt to mutate immutable object with appendString"


To avoid this problem , while doing #2, you need to make mutableCopy to make a mutable string and assign.  Check below for sample code.

    
    //Immutable string , cant modify
    NSString *firstName = @"Pasumarthi";
    //mutable string can modify
    NSMutableString *nameString = [NSMutableString stringWithString:@"Chandu"];
 
    // invalid - trying to make mutable string to non-mutable string 
    //nameString = firstName;
    //invalid - we cant make normal string copy to the mutable.
    //nameString =  [firstName copy]; 
    
    // valid as mutablestring is subclass of string
    nameString = [firstName mutableCopy]; 
    
    // valid as mutablestring is subclass of string    
    firstName  = nameString;
    //valid as nameString is mutable    
    [nameString appendString:@" Appu"];


Happy Coding!!!

Popular Posts