当你将对象添加到集合中,比如NSMutableArray
,这个对象是被复制的,也就是值语义,还是被保留的,也就是引用语义?
我在这个例子中感到困惑:
NSMutableString *testStr = [@"test" mutableCopy];
NSMutableArray *arrayA = [[NSMutableArray alloc] init];
[arrayA addObject:testStr];
NSLog(@"%@", arrayA); // output: test
testStr = [@"world" mutableCopy];
NSLog(@"%@", arrayA); // output: test
// testStr is copied - value semantics
NSMutableArray *testArr = [@[@1, @2] mutableCopy];
NSMutableArray *arrarB = [[NSMutableArray alloc] init];
[arrarB addObject:testArr];
NSLog(@"%@", arrarB); // output: [1, 2]
[testArr addObject:@3];
NSLog(@"%@", arrarB); // output: [1, 2, 3]
// testArr is retained - reference semantics
你可以看到:如果对象是一个
NSMutableString
,它看起来像是对象被复制了——你改变对象不会影响数组中的对象。然而,如果对象是一个
NSMutableArray
,当你改变对象时,数组中的对象也会被改变——就像你保留对象或通过引用传递一样。这里有什么我漏掉的吗? 谢谢。
NSHashTable
作为列表,允许您指定它如何处理添加到其中的对象引用。 您可以将给定实例的默认行为设置为弱、强或甚至是复制。 更多信息请参见:http://nshipster.com/nshashtable-and-nsmaptable/ - Mick MacCallum