What is the difference between copy
and mutableCopy
when used on either an NSArray
or an NSMutableArray
?
This is my understanding; is it correct?
// ** NSArray ** NSArray *myArray_imu = [NSArray arrayWithObjects:@"abc", @"def", nil]; // No copy, increments retain count, result is immutable NSArray *myArray_imuCopy = [myArray_imu copy]; // Copys object, result is mutable NSArray *myArray_imuMuta = [myArray_imu mutableCopy]; // Both must be released later
// ** NSMutableArray ** NSMutableArray *myArray_mut = [NSMutableArray arrayWithObjects:@"A", @"B", nil]; // Copys object, result is immutable NSMutableArray *myArray_mutCopy = [myArray_mut copy]; // Copys object, result is mutable NSMutableArray *myArray_mutMuta = [myArray_mut mutableCopy]; // Both must be released later
The primary difference between NSArray and NSMutableArray is that a mutable array can be changed/modified after it has been allocated and initialized, whereas an immutable array, NSArray , cannot.
In addition to the provided initializers, such as initWithObjects: , you can create an NSArray object using an array literal. NSArray *array = @[someObject, @"Hello, World!", @42]; In Objective-C, the compiler generates code that makes an underlying call to the arrayWithObjects:count: method.
The NSMutableArray class declares the programmatic interface to objects that manage a modifiable array of objects. This class adds insertion and deletion operations to the basic array-handling behavior inherited from NSArray .
arrays can't contain nil.
copy
and mutableCopy
are defined in different protocols (NSCopying
and NSMutableCopying
, respectively), and NSArray
conforms to both. mutableCopy
is defined for NSArray
(not just NSMutableArray
) and allows you to make a mutable copy of an originally immutable array:
// create an immutable array NSArray *arr = [NSArray arrayWithObjects: @"one", @"two", @"three", nil ]; // create a mutable copy, and mutate it NSMutableArray *mut = [arr mutableCopy]; [mut removeObject: @"one"];
Summary:
mutableCopy
to be mutable, regardless of the original type. In the case of arrays, the result should be an NSMutableArray
.copy
to be mutable! copy
ing an NSMutableArray
may return an NSMutableArray
, since that's the original class, but copy
ing any arbitrary NSArray
instance would not.Edit: re-read your original code in light of Mark Bessey's answer. When you create a copy of your array, of course you can still modify the original regardless of what you do with the copy. copy
vs mutableCopy
affects whether the new array is mutable.
Edit 2: Fixed my (false) assumption that NSMutableArray -copy
would return an NSMutableArray
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With