8

copyARC中关键字的作用是什么

我发现copy(关键字)可以在 ARC 中使用,而retain不能release使用。此外,ARC中的角色与MRCcopy中的角色相同吗?copy如果是,是否copyretainCount在 ARC 中 +1?

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

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

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

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

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

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

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

copy是不是表示作为类型使用时不需要阻塞id

4

3 回答 3

6

是的,copyARC中的作用与copyMRR中的作用相同。

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

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

关于作为参数传递时的block需要。copyid

苹果文件说:

通常,您不需要复制(或保留)块。仅当您希望在声明它的范围内销毁块后使用该块时,您才需要制作一份副本。复制将块移动到堆中

正如ughoavgfhw 所说

块与其他用于内存管理的对象类似,但并不相同。当创建访问局部变量的块时,它会在堆栈上创建。这意味着它仅在其范围存在时才有效。要保存此块以供以后使用,您必须将其复制到堆中

于 2013-04-24T13:47:01.830 回答
4

复制就像名字所暗示的那样。它返回对象的副本。假设你有一个可变对象并且你有一个指向它的指针。然后你在代码中的其他地方引用它,ARC 会假设你想指向同一个对象并为你保留它。在这种情况下,如果您修改其中任何一个,都将反映所做的更改。如果你用 a 指向它,copy你会得到一个新对象,修改一个不会影响另一个:

NSMutableArray* objA = [NSMutableArray new];
NSMutableArray* objB = objA;
/* adding an object to either will be in both since they point to the same object*/
objB = [objA mutableCopy];
/*adding an object to one WILL NOT affect the other, they are different, distinct objects*/

在这里的文档中:

http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/bxVariables.html#//apple_ref/doc/uid/TP40007502-CH6-SW1

它提到当块被复制时,它们的所有 Objective-C 对象都会收到一个强引用,这样它们就不会在块执行之前退出范围。

于 2013-04-22T14:48:25.953 回答
1

当您copy在 ARC 中使用时,它的作用与不使用 ARC 相同,即它创建接收副本的对象的副本(它在内存中创建一个新的对象实例),并创建strong与执行代码的对象的关系。
这意味着对象的副本现在的保留计数为 1,但这与 ARC 中的您无关,因为这是自动处理的。

于 2013-04-22T14:47:21.000 回答