最近面试了一些人,发现大部分人对mutable和inmutable对象并不是分得很清,更不用提它们copy和mutableCopy。下面这个小代码可以帮助大家理解
NSString *a = @"abc";
NSLog(@"NSString: %p %p %p", a, [a copy], [a mutableCopy]);
NSMutableString *c = [NSMutableString stringWithString:a];
NSLog(@"NSMutableString: %p %p %p", c, [c copy], [c mutableCopy]);
NSArray *f = @[a];
NSLog(@"NSArray: %p[%p] %p[%p] %p[%p]", f, f[0], [f copy], [f copy][0], [f mutableCopy], [f mutableCopy][0]);
NSMutableArray *h = [NSMutableArray arrayWithArray:f];
NSLog(@"NSMutableArray: %p[%p] %p[%p] %p[%p]", h, h[0], [h mutableCopy], [h mutableCopy][0], [h mutableCopy], [h mutableCopy][0]);
输出结果
NSString: 0x10004c170 0x10004c170 0x17407ce40
NSMutableString: 0x17407ce40 0xa000000006362613 0x17407ce80
NSArray: 0x17401b5d0[0x10004c170] 0x17401b5d0[0x10004c170] 0x174059ce0[0x10004c170]
NSMutableArray: 0x174059ce0[0x10004c170] 0x17405a280[0x10004c170] 0x174059dd0[0x10004c170]
答案:
非集合类对象:对 immutable 对象进行 copy 操作,是指针复制,mutableCopy 操作时内容复制;对 mutable 对象进行 copy 和 mutableCopy 都是内容复制。
集合类对象: copy 和 mutableCopy 的行为表现和非集合对象一样;集合对象里的元素任何情况下都是指针复制。