Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何在圆弧中复制对象_Objective C_Automatic Ref Counting - Fatal编程技术网

Objective c 如何在圆弧中复制对象

Objective c 如何在圆弧中复制对象,objective-c,automatic-ref-counting,Objective C,Automatic Ref Counting,现在它在ARC中没有“复制”属性,所以当我想要复制对象时应该怎么做? 然后我编写了一个测试代码: 测试h @property (strong, nonatomic) NSMutableString *str1; @property (strong, nonatomic) NSMutableString *str2; test.m self.str1 = [[NSMutableString alloc] initWithString:@"Hello"]; self.str2 = [self.st

现在它在ARC中没有“复制”属性,所以当我想要复制对象时应该怎么做? 然后我编写了一个测试代码:

测试h

@property (strong, nonatomic) NSMutableString *str1;
@property (strong, nonatomic) NSMutableString *str2;
test.m

self.str1 = [[NSMutableString alloc] initWithString:@"Hello"];
self.str2 = [self.str1 copy];
[self.str2 appendString:@"World"];
NSLog(@"str1:%@,str2:%@",self.str1,self.str2);
当我跑的时候,它崩溃了:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to mutate immutable object with appendString:'

那么,我应该怎么做呢?

copy
应该始终返回对象的不可变副本,
mutableCopy
(如果可用)应该始终返回可变对象,而不管接收者是可变的还是不可变的。这样,您可以确保当您请求
副本时,它将是不可变的,当您请求
可变副本时,它将是可变的


这一概念已经存在多年,并不是ARC特有的。ARC只是处理对象的内存管理,而不是它们的易变性。

copy
应始终返回对象的不可变副本,
mutableCopy
(如果可用)应始终返回易变对象,无论接收者是可变的还是不可变的。这样,您可以确保当您请求
副本时,它将是不可变的,当您请求
可变副本时,它将是可变的


这一概念已经存在多年,并不是ARC特有的。ARC只是处理对象的内存管理,而不是对象的易变性。

您是否尝试过使用
mutableCopy
而不是
copy
?是否
[-NSMutableString copy]
真的返回不可变字符串?!很有效,谢谢!这是我在ARC中的粗心:)@noa:是的,
copy
总是给你一个不可变的版本。你试过用
mutableCopy
而不是
copy
吗?
[-NSMutableString copy]
真的返回一个不可变的字符串吗?!很有效,谢谢!是我的粗心:)@noa:是的,
copy
总是给你一个不变的版本。