iOSInterviewQuestions
iOSInterviewQuestions copied to clipboard
第13题 疑问 对非集合类对象的copy操作
题目中给出的链接:https://www.zybuluo.com/MicroCai/note/50592
NSMutableString *string = [NSMutableString stringWithString: @"origin"];
//copy
NSString *stringCopy = [string copy];
NSMutableString *mStringCopy = [string copy];
NSMutableString *stringMCopy = [string mutableCopy];
//change value
[mStringCopy appendString:@"mm"]; //crash
[string appendString:@" origion!"];
[stringMCopy appendString:@"!!"];
问什么会在这么一行Crash
[mStringCopy appendString:@"mm"]; //crash
根据他得描述,『原因就是 copy 返回的对象是 immutable 对象』, 难道不应该是下面这一行出错吗?
NSMutableString *mStringCopy = [string copy];
copy 返回的是immutable,而所要复制的对象是 mutable.
第四个问题 已经给出了解释,希望能解决你的疑问。
第四题也是这么表述的,说的是结果。我的意思是,既然copy给出的是个immutable 对象,为何
NSMutableString *mStringCopy = [string copy];
能够运行成功?
@arkilis 即使是 NSMutableString *mString = [@[] copy]; 也不会报错呢。 或许跟runtime的机制有关系吧。
@wtuyp 我觉得应该是这样的
NSMutableString *string = [NSMutableString stringWithString: @"origin"];
//copy
NSString *stringCopy = [string copy];
NSMutableString *mStringCopy = [string copy]; // 能够完成赋值, 这个时候并不检查mStringCopy类型
NSMutableString *stringMCopy = [string mutableCopy];
//change value
[mStringCopy appendString:@"mm"]; //crash // 在运行的过程中发现类型是不对的, 于是出错
[string appendString:@" origion!"];
[stringMCopy appendString:@"!!"];
- (id)copy;
- (id)mutableCopy;
@arkilis 应该明白了吧,方法的返回值是id,所以正如@wtuyp所说,怎么写都不会错。只是运行时就错了。