【问题标题】:How to copy a custom Objective-C object?如何复制自定义的 Objective-C 对象?
【发布时间】:2012-10-06 23:10:32
【问题描述】:

我有一个类,比如说 Person 类。在课堂上我有几个 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:]: 无法识别的选择器发送到实例 0x100108a30

我注意到原始数组的类型是 '_NSArrayM' 但副本是 '_NSArrayI'...

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

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

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

干杯, 尼克

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

sortUsingSelector:@selector(caseInsensitiveCompare:)

对数组进行排序。

【问题讨论】:

    标签: objective-c object copy deep-copy custom-object


    【解决方案1】:

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

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

    注意如果你只是在做

    @property NSMutableArray *array;
    

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

    【讨论】:

    • 谢谢你的回答。我用过(复制)。抱歉,我没有将代码复制到我的帖子中,所以我忘记了这一点。我现在使用(强),它工作正常。非常感谢。
    • 这真的很烦人——我原以为属性上的copy 会生成一个可变副本——相反,你传入一个可变数组,而你的对象得到一个不可变副本。恕我直言,这是一个属性错误:)
    • 是的。就像我说的我是 Objective-C 的新手,所以我现在正在边做边学,我还没有真正理解属性。 :D 使用 ARC 可以只使用(弱)和(强)吗?再次感谢您的友好支持!
    • 如果您的属性是具有可变子类的东西(即您应该复制 NSArray、NSString、NSSet 等),那么使用 copy 而不是 strong 是个好主意。将strong 用于您想要拥有的对象,将weak 用于诸如委托之类的属性,即您想知道但不属于您的对象的事物。最后将assign 用于不是对象的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 2011-03-30
    相关资源
    最近更新 更多