sha*_*ell 8 copy objective-c ios automatic-ref-counting
关键字copy在ARC中的作用是什么
我觉得copy(关键字)可在ARC使用,而retain并release不能使用.而且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类型时不需要阻止?
是的,copyARC中的角色与copyMRR中的角色相同
该copy会调用该copyWithZone:方法.当它发送到可变对象,它会返回一个克隆不可变对象,其retainCount为1.当它发送到不可变对象,它不会复制,它会返回对象本身,而是retainCount +1.
因此,当您在ARC中使用副本时,您可以这样使用:object1 = [object2 copy];ARC将管理其中的retainCount object1,当object1ARC释放时,其object2retainCount将是相应的更改.所以你不用担心记忆.
关于block需要copy当作为id参数传递时.
在苹果的文件说:
通常,您不需要复制(或保留)块.当您希望在销毁声明范围之后使用该块时,您只需要制作一个副本.复制将块移动到堆
正如ughoavgfhw所说:
块与内存管理的其他对象类似,但不一样.当创建访问局部变量的块时,它将在堆栈上创建.这意味着只有在其范围存在的情况下它才有效.要保存此块以供以后使用,必须将其复制,然后将其复制到堆中
| 归档时间: |
|
| 查看次数: |
3870 次 |
| 最近记录: |