How do I convert NSMutableArray to NSArray? How do I convert NSMutableArray to NSArray? objective-c objective-c

How do I convert NSMutableArray to NSArray?


NSArray *array = [mutableArray copy];

Copy makes immutable copies. This is quite useful because Apple can make various optimizations. For example sending copy to a immutable array only retains the object and returns self.

If you don't use garbage collection or ARC remember that -copy retains the object.


An NSMutableArray is a subclass of NSArray so you won't always need to convert but if you want to make sure that the array can't be modified you can create a NSArray either of these ways depending on whether you want it autoreleased or not:

/* Not autoreleased */NSArray *array = [[NSArray alloc] initWithArray:mutableArray];/* Autoreleased array */NSArray *array = [NSArray arrayWithArray:mutableArray];

EDIT: The solution provided by Georg Schölly is a better way of doing it and a lot cleaner, especially now that we have ARC and don't even have to call autorelease.


I like both of the 2 main solutions:

NSArray *array = [NSArray arrayWithArray:mutableArray];

Or

NSArray *array = [mutableArray copy];

The primary difference I see in them is how they behave when mutableArray is nil:

NSMutableArray *mutableArray = nil;NSArray *array = [NSArray arrayWithArray:mutableArray];// array == @[] (empty array)NSMutableArray *mutableArray = nil;NSArray *array = [mutableArray copy];// array == nil