前两天去网易面试的时候面试官在问内存管理特性的时候问到了这样一个问题:能不能对一个是可变类型的属性采用copy
特性,我当时的回答是不能,面试官问为什么不能,当时没有想到原因,但是因为自己遇到过把一个NSMutableArray
的属性声明为copy
特性时出现了bug,所以知道这样做是不行的,但是具体为什么不行没有深入去了解。今天详细做了一个测试发现了这么做不可行的原因,废话不多说,先上代码:
NSString与NSMutableString
首先看NSString
与NSMutableString
,我编写了如下的代码:
// 对string进行copy得到的copyString指针还是指向string
NSString *string = @"test";
NSString *copyString = [string copy];
NSLog(@"string pointer: %p, copyString pointer: %p",string,copyString);
// 对mutableString进行copy得到的mutableCopyString的指针指向了一个新的string(新的mutableCopyString的类型是NSMutableString),那么如果对NSMutabelString的内存管理属性使用copy的话相当于重新创建了一个与之前对象行为一样的对象,浪费了内存
NSMutableString *mutableString = [NSMutableString stringWithFormat:@"test"];
NSMutableString *mutableCopyString = [mutableString copy];
NSLog(@"mutableString pointer: %p, mutableCopyString pointer: %p",mutableString,mutableCopyString);
NSLog(@"mutableCopyString is member of class NSString: %hhd",[mutableString isKindOfClass:[NSMutableString class]]);
NSLog(@"mutableCopyString is member of class NSString: %hhd",[mutableString isKindOfClass:[NSString class]]);
运行结果:
2016-08-21 18:16:15.053 TestObjectiveCFeature[31161:27458558] str