Objective-C:ARC中的块

Objective-C:ARC中的块,第1张

概述我正在转换到ARC(自动引用计数),这个文档非常有用: Transitioning to ARC Release Notes.它说: How do blocks work in ARC? Blocks “just work” when you pass blocks up the stack in ARC mode, such as in a return. You don’t have to c 我正在转换到ARC(自动引用计数),这个文档非常有用: Transitioning to ARC Release Notes.它说:

How do blocks work in ARC?

Blocks “just work” when you pass blocks up the stack in ARC mode,such as in a return. You don’t have to call Block copy any more. You still need to use [^{} copy] when passing “down” the stack into arrayWithObjects: and other methods that do a retain.

有人可以详细说明这一点或举一些例子吗?我明白这通常意味着我不需要再进行[块复制],即使块在声明的范围之外使用,因为ARC现在会更加巧妙地处理它,但我仍然需要在我想要时复制它将块传递给保留它的函数.它是否正确?

实际上我已经尝试了一点点,到目前为止,即使我没有复制将块传递给数组也没关系,所以这个问题.谢谢!

@H_404_12@解决方法 让我们从MRC(手动参考计数)的角度考虑问题.当您从函数返回堆栈块时,返回它的副本(通常使用[[copy] autorelease])始终是正确的做法.这是因为堆栈块的生命周期是函数调用,它正在结束.因此,为了使返回的指针在返回后指向有效的块,当然您必须返回堆副本.

但是,将块作为参数传递给函数或方法呢?你应该通过它的副本吗?这有点复杂.我们知道,如果你需要存储一个块供以后在一个比函数调用更长的地方使用(例如在一个实例变量或全局变量等中),你需要存储一个块的副本.但是我们怎么知道这是真的(如果它是真的,哪个函数(调用者/被调用者)负责复制它)?

通常,当您将其传递给参数为块类型的函数或方法时,您不需要复制它,因为,作为一个带有块参数的函数,该函数负责在需要时复制它将它存放在以后.

但是将块传递给参数为非块类型(如ID)的函数或方法呢?然后该函数不知道它的参数是一个块,因此只有在需要存储它以供以后使用时才会保留该对象,而不是复制它.在这种情况下,如果我们知道函数或方法将存储对象以供稍后使用(例如使用 – [NSMutableArray addobject:]),我们应该传递该块的副本.我们应该总是传递副本吗?不必要.如果我们知道函数或方法将不存储块以供稍后存储(例如仅打印对象),则制作块的副本是低效的.

在ARC中,编译器会尝试尽可能多地为您执行 *** 作.因此,在返回堆栈块(“传递它”)的情况下,编译器知道返回副本总是正确的,所以它隐含地这样做.这就是为什么你不再需要自己动手了.

但是,为了将块传递给方法或函数(“传递它”),并不总是能够自动确定是否需要复制,并且额外的复制可能效率低下,因此编译器不会自动执行任何 *** 作;而程序员需要弄清楚它.

我注意到在最近版本的编译器中,ARC会在很多情况下复制块,我想也许,所以他们可能会将ARC的实现改为几乎总是复制块,以便谨慎行事,并且他们认为性能成本并不重要.因此,它现在可以直接将块传递给addobject:无需显式复制.但我相信ARC的情况并非总是如此,并且语言无法保证这一点,或者此行为将在未来保留.

@H_404_12@ @H_404_12@ 总结

以上是内存溢出为你收集整理的Objective-C:ARC中的块全部内容,希望文章能够帮你解决Objective-C:ARC中的块所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1238027.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存