How to copy a custom Objective-C object?
-
05-07-2021 - |
Pregunta
I have a class, say the class Person. In than class I have several NSMutableArrays.
@property NSMutableArray *arrayOne;
@property NSMutableArray *arrayTwo;
...
Now I want to copy that Class so I can return it from a function and use the copy and change it's data. I want to have a new copy of the object in memory not another reference to the same address.
To do that I have implemented this in my Person.m:
-(id)copyWithZone:(NSZone *)zone
{
Person *copy = [[Person allocWithZone:zone] init;
copy.arrayOne = [NSMutableArray arrayWithArray:self.arrayOne];
copy.arrayTwo = [NSMutableArray arrayWithArray:self.arrayTwo];
...
return copy;
}
So far this works just like I want it to, but when I try to sort the arrays of the copy, I get an error: -[__NSArrayI sortUsingSelector:]: unrecognized selector sent to instance 0x100108a30
I have noticed that the original arrays are of the type '_NSArrayM' but the copy is '_NSArrayI'...
So what did I wrong? I have heard of deep copying using NSArchiver and NSUnarchiver... Do I have to use that? Sorry, I am quite new to C and Objective-C... :D
I hope you can help me out of this. =)
Sorry about my 'school-english'....
Cheers, Nick
EDIT: The arrays consist of NSString objects, so I can use
sortUsingSelector:@selector(caseInsensitiveCompare:)
to sort the array.
Solución
How are your mutable array properties being declared in your header file?
// Wrong
@property (copy) NSMutableArray *array;
@property (assign) NSMutableArray *array;
// Right
@property (strong) NSMutableArray *array;
NB If you're just doing
@property NSMutableArray *array;
then I'm amazed your code has got this far :) The default property memory semantics is assign
- which won't tell ARC to retain your arrays in any way at all :) You need to specify strong
.