2

我有一个类,说类人。在课堂上,我有几个 NSMutableArrays。

@property NSMutableArray *arrayOne;
@property NSMutableArray *arrayTwo;
...

现在我想复制那个类,这样我就可以从函数中返回它并使用副本并更改它的数据。我想在内存中拥有对象的新副本,而不是对同一地址的另一个引用。

为此,我在我的 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;
}

到目前为止,这就像我想要的那样工作,但是当我尝试对副本的数组进行排序时,出现错误:-[__NSArrayI sortUsingSelector:]: unrecognized selector sent to instance 0x100108a30

我注意到原始数组的类型是“_ NSArrayM”,但副本是“ _NSArrayI”...

那我做错了什么?我听说过使用 NSArchiver 和 NSArchiver 进行深度复制...我必须使用它吗?抱歉,我对 C 和 Objective-C 很陌生...:D

我希望你能帮我解决这个问题。=)

对不起我的“学校英语”......

干杯,尼克

编辑:数组由 NSString 对象组成,所以我可以使用

sortUsingSelector:@selector(caseInsensitiveCompare:)

对数组进行排序。

4

1 回答 1

3

你的可变数组属性是如何在你的头文件中声明的?

// Wrong
@property (copy) NSMutableArray *array;
@property (assign) NSMutableArray *array;

// Right
@property (strong) NSMutableArray *array;

注意如果你只是在做

@property NSMutableArray *array;

那么我很惊讶你的代码已经走到这一步了:) 默认属性内存语义是assign- 它不会告诉 ARC 以任何方式保留你的数组:) 你需要指定strong.

于 2012-10-06T23:33:28.470 回答