ARC中"副本"的作用是什么

sha*_*ell 8 copy objective-c ios automatic-ref-counting

关键字copy在ARC中的作用是什么

我觉得copy(关键字)可在ARC使用,而retainrelease不能使用.而且copyARC中的作用是否copy与MRC中的作用相同?如果是的话,确实在ARC中copy获得retainCount+1?

我看过有关ARChe的mike ash博客说:

您需要显式复制作为id参数传递的块:  

 [myArray addObject: [^{ DoSomethingMagical(); } copy]];
Run Code Online (Sandbox Code Playgroud)

但是当我测试这样的代码(不使用copy)时,它的效果也很好.

NSArray *array = [[NSArray alloc] initWithObjects:^{NSLog(@"hahaha");}, nil];

[self test:[array objectAtIndex:0]];

- (void)test:(void (^)(void))completion
{
        completion();
}
Run Code Online (Sandbox Code Playgroud)

是否意味着copy在用作id类型时不需要阻止?

Guo*_*uan 6

是的,copyARC中的角色与copyMRR中的角色相同

copy会调用该copyWithZone:方法.当它发送到可变对象,它会返回一个克隆不可变对象,其retainCount为1.当它发送到不可变对象,它不会复制,它会返回对象本身,而是retainCount +1.

因此,当您在ARC中使用副本时,您可以这样使用:object1 = [object2 copy];ARC将管理其中的retainCount object1,当object1ARC释放时,其object2retainCount将是相应的更改.所以你不用担心记忆.

关于block需要copy当作为id参数传递时.

苹果的文件说:

通常,您不需要复制(或保留)块.当您希望在销毁声明范围之后使用该块时,您只需要制作一个副本.复制将块移动到堆

正如ughoavgfhw所说:

块与内存管理的其他对象类似,但不一样.当创建访问局部变量的块时,它将在堆栈上创建.这意味着只有在其范围存在的情况下它才有效.要保存此块以供以后使用,必须将其复制,然后将其复制到堆中