iOSInterviewQuestions icon indicating copy to clipboard operation
iOSInterviewQuestions copied to clipboard

第13题 疑问 对非集合类对象的copy操作

Open arkilis opened this issue 8 years ago • 5 comments

题目中给出的链接: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.

arkilis avatar Sep 21 '15 20:09 arkilis

第四个问题 已经给出了解释,希望能解决你的疑问。

ChenYilong avatar Sep 22 '15 07:09 ChenYilong

第四题也是这么表述的,说的是结果。我的意思是,既然copy给出的是个immutable 对象,为何

NSMutableString *mStringCopy = [string copy];

能够运行成功?

arkilis avatar Sep 22 '15 20:09 arkilis

@arkilis 即使是 NSMutableString *mString = [@[] copy]; 也不会报错呢。 或许跟runtime的机制有关系吧。

wtuyp avatar Sep 24 '15 09:09 wtuyp

@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:@"!!"];

arkilis avatar Sep 25 '15 00:09 arkilis

- (id)copy;
- (id)mutableCopy;

@arkilis 应该明白了吧,方法的返回值是id,所以正如@wtuyp所说,怎么写都不会错。只是运行时就错了。

lych0317 avatar Jan 13 '16 08:01 lych0317