最近面試了一些人藤滥,發(fā)現(xiàn)大部分人對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]);
輸出結(jié)果
NSString: 0x10004c170 0x10004c170 0x17407ce40
NSMutableString: 0x17407ce40 0xa000000006362613 0x17407ce80
NSArray: 0x17401b5d0[0x10004c170] 0x17401b5d0[0x10004c170] 0x174059ce0[0x10004c170]
NSMutableArray: 0x174059ce0[0x10004c170] 0x17405a280[0x10004c170] 0x174059dd0[0x10004c170]
答案:
非集合類對象:對 immutable 對象進(jìn)行 copy 操作唧领,是指針復(fù)制焰手,mutableCopy 操作時內(nèi)容復(fù)制;對 mutable 對象進(jìn)行 copy 和 mutableCopy 都是內(nèi)容復(fù)制荠藤。
集合類對象: copy 和 mutableCopy 的行為表現(xiàn)和非集合對象一樣伙单;集合對象里的元素任何情況下都是指針復(fù)制。