繁体   English   中英

将对象从一个NSMutableArray复制到另一个NSMutableArray

[英]copy objects from one NSMutableArray to another NSMutableArray

我试图理解将对象从一个NSMutableArray复制到另一个。 请考虑以下2种情况:1-将原件复制到克隆中,克隆中的更改将影响原件。 2-将原件复制到克隆中,副本中的更改不会影响原件。

首先,我尝试首先使用以下代码生成方案1。 据我了解,当不使用“ mutablecopy”复制数组时,克隆数组将只保留指向原始字符串对象的指针。 因此,如果我要将克隆的第一个元素更改为其他对象,那么原始对象的第一个元素也会更改得对吗? ...但这不是我得到的结果。 为什么?

事实,当我使用可变拷贝时

[self.cloneArray addObject:[[self.originalArray objectAtIndex:i] mutableCopy]];

我得到相同的结果。 我很困惑。

ArrayClass.h

@interface ArrayClass : NSObject {
    NSMutableArray *_originalArray;
    NSMutableArray *_cloneArray;
}

@property (nonatomic, retain) NSMutableArray *originalArray;
@property (nonatomic, retain) NSMutableArray *cloneArray;

ArrayClass.m

@synthesize originalArray = _originalArray;
@synthesize cloneArray = _cloneArray;

_originalArray = [[NSMutableArray alloc] initWithObjects: @"one", @"two", @"three", @"four", @"five", nil];
_cloneArray = [[NSMutableArray alloc] initWithCapacity:[self.originalArray count]];

for (int i=0; i<5; i++) {
    [self.cloneArray addObject:[self.originalArray objectAtIndex:i]];
}

// make change to the first element of the clone array
[self.cloneArray replaceObjectAtIndex:0 withObject:@"blah"];

for (int n=0; n<5; n++) {
    NSLog(@"Original:%@ --- Clone:%@", [self.originalArray objectAtIndex:n], [self.cloneArray objectAtIndex:n]);
}

...

2011-03-27 03:23:16.637 StringTest[1751:207] Original:one --- Clone:blah
2011-03-27 03:23:16.638 StringTest[1751:207] Original:two --- Clone:two
2011-03-27 03:23:16.639 StringTest[1751:207] Original:three --- Clone:three
2011-03-27 03:23:16.642 StringTest[1751:207] Original:four --- Clone:four
2011-03-27 03:23:16.643 StringTest[1751:207] Original:five --- Clone:five

您在想这种方法太辛苦了。

在Objective-C中,您具有对对象的引用。 NSString *foo; 只需定义一个引用NSString的变量foo即可。 如果您说NSString *bar = foo; ,则bar将引用foo所引用的任何对象。 不多不少。

NSArray只是对象引用的集合。 因此,如果您说:

NSArray *b = [NSArray arrayWithArray: a];

您正在创建一个数组b ,其中包含与a完全相同的一组对象的所有相同引用。 如果您修改由a引用的对象,则该对象将与b对象完全相同,并且修改将反映出来。

复制对象时,将创建一个内部状态与原始状态相同的对象。 也就是说,当您说NSMutableString *foo = [barString mutableCopy]; ,则foo是对字符串的引用; barString不同。

所以...当创建一个新数组时,问题是您希望该数组包含与原始数组完全相同的内容,还是希望它包含一组可以修改的对象?

您对正在发生的事情有误解。 replaceObjectAtIndex:withObject:调用不是在修改数组中的对象,而是在修改数组本身。 在此行之后:

[self.cloneArray replaceObjectAtIndex:0 withObject:@"blah"];

您已经替换了克隆数组中的对象,但是根本没有更改原始数组。 如果您实际上修改了放置在数组中的NSString对象,则可能能够获得预期的行为。 但是,您将无法使用在示例中放入原始数组的对象来完成此操作,因为它们是不可变的字符串对象。 如果您在其中插入了可变字符串,请使用相同的循环“克隆”您的数组,然后执行以下操作:

[[self.cloneArray objectAtIndex:0] appendString:@"some junk to append"];

您实际上将修改索引为0的字符串对象。由于两个数组仍然包含相同的对象,因此您将获得“通过更改克隆数组中的对象来修改原始数组”的行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM