gpt4 book ai didi

ios - ARC中 "copy"的作用是什么

转载 作者:可可西里 更新时间:2023-11-01 03:08:16 25 4
gpt4 key购买 nike

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

我发现 copy(关键字)可以在 ARC 中使用,而 retainrelease 不能使用。另外ARC中copy的作用和MRC中copy的作用一样吗?如果是,copy 是否使 ARC 中的 retainCount +1?

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

you need to explicitly copy blocks that you pass as id parameters:  

 [myArray addObject: [^{ DoSomethingMagical(); } copy]];

但是当我测试这样的代码时(不使用 copy)它也运行良好。

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

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

- (void)test:(void (^)(void))completion
{
  completion();
}

是不是说作为id类型使用就不需要copy block 了?

最佳答案

是的,copy在ARC中的作用和copy在MRR中的作用是一样的

copy 将调用 copyWithZone: 方法。当它发送给可变对象时,它会返回一个克隆的不可变对象(immutable对象),它的retainCount为1。当它发送给不可变对象(immutable对象)时,它不会复制,它会返回对象本身,但retainCount +1。

所以当你在 ARC 中使用复制时,你可以这样使用:object1 = [object2 copy]; ARC 将管理 object1 的 retainCount,当 object1被ARC释放,object2的retainCount会相应变化。所以你不用担心内存。

关于 block 作为id参数传递时需要复制

apple document说:

Typically, you shouldn’t need to copy (or retain) a block. You only need to make a copy when you expect the block to be used after destruction of the scope within which it was declared. Copying moves a block to the heap

和作为ughoavgfhw said :

Blocks are similar to other objects for memory management, but not the same. When a block which accesses local variables is created, it is created on the stack. This means that it is only valid as long as its scope exists. To save this block for later, you must copy it, which copies it to the heap

关于ios - ARC中 "copy"的作用是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16149653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com