- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
根据 Transitioning to ARC Release Notes :
__autoreleasing is used to denote arguments that are passed by reference (id *) and are autoreleased on return.
例如:
-(BOOL)performOperationWithError:(NSError * __autoreleasing *)error;
但是与以下相比,上述的优点是什么:
-(BOOL)performOperationWithError:(NSError * __strong *)error;
更新:
有几个答案提到了编译器处理 var 和参数之间不匹配的临时 var 技巧作为 __autoreleasing
的优势。我不明白为什么编译器不能为 __strong
参数做同样的事情。我的意思是,对于 __weak
var 和 __strong
参数,编译器可以类似地这样做:
NSError * __weak error;
NSError * __strong tmp = error;
BOOL OK = [myObject performOperationWithError:&tmp];
error = tmp;
if (!OK) {
// Report the error.
}
编译器知道 -(BOOL)performOperationWithError:(NSError * __strong *)error;
返回一个强引用(+1)所以它像任何 new
一样处理它 -家庭法。由于 tmp
与 error
存在于相同的范围内,只要 error
存在,编译器就可以合理地保持它的存在,因此 __weak
reference(error
) 现在由 __strong
reference(tmp
) 支持,并且在范围结束之前不会被取消。
最佳答案
在这种情况下,将 __weak
对象隐式转换为 __strong
对象会改变程序的语义,这是编译器永远不应该做的事情。
举个例子
NSError *error;
BOOL success = [myObject performOperationWithError:&error];
if (!success) {
// Report the error
}
在这种情况下,error
局部变量被 ARC 自动推断为 __strong
。
同时
的error
参数
-(BOOL)performOperationWithError:(NSError * __autoreleasing *)error;
是 NSError * __autoreleasing *
类型。
请注意,在任何情况下,ARC 都会将通过引用 (id *
) 传递的参数推断为 id __autoreleasing *
类型,因此上述签名等同于
-(BOOL)performOperationWithError:(NSError **)error;
在 ARC 下。
因此我们有一个不匹配,因为我们将一个 __strong
注释变量传递给一个需要 __autoreleasing
参数的方法。
在我们的示例中,编译器将通过创建本地 __autoreleasing tmp
变量来解决此类不匹配问题。
代码变为
NSError * __strong error;
NSError * __autoreleasing tmp = error;
BOOL success = [myObject performOperationWithError:&tmp];
error = tmp;
if (!success) {
// Report the error.
}
现在假设我们可以更改 performOperationWithError:
的签名。
如果我们想避免使用 tmp
变量的“编译器技巧”,我们可以将我们的签名声明为
-(BOOL)performOperationWithError:(NSError * __strong *)error;
我们有一个 __strong
变量,现在我们将它传递给一个需要 __strong
参数的方法,所以我们刚刚消除了不匹配。
__strong
参数?一个原因是将参数声明为 __autoreleasing
将使该方法接受甚至是 __weak
引用。
在当前示例中它没有多大意义,但在某些情况下我们希望通过引用传递一个 __weak
变量并声明 __autoreleasing
(或离开 ARC 来推断它)将使我们能够这样做。
ARC 将应用上面看到的相同技巧,创建一个 __autoreleasing tmp
变量。
目前介绍的机制名为pass-by-writeback。
这种机制被设计为与__autoreleasing
、__strong
和__weak
变量一起工作,因此程序员可以安全地依赖类型推断由编译器生成,不太关心周围的注释变量。
声明一个 id __strong *
参数在某些情况下可能有意义,但通常它可能导致编译器生成意外错误。
我的建议是:“让编译器发挥他的魔力,你就会好起来的”
I don't see why compiler can not do the same trick for
__strong
argument.
告诉编译器以 __autoreleasing
方式处理 __strong
或 __weak
变量的管理没问题,因为它基本上意味着:“请编译器自动执行正确的操作。”
这就是为什么上面看到的技巧可以毫无问题地工作。
另一方面,如果您将变量声明为 __weak
,您可能有充分的理由这样做,并且您最不想做的就是在您明确指定时隐式保留它。这会从根本上改变您编写的代码片段的语义,因此编译器不会那样做(谢天谢地!)。
换句话说
__weak
--> __autoreleasing
好 __strong
--> __autoreleasing
好 __weak
<--> __strong
错了!
关于objective-c - 声明方法参数 __autoreleasing 有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14554121/
如果函数定义顺序不对,Jslint 将指出错误。 显然 jslint 是严格的,但我想知道将函数按顺序排列是否有任何好处。 我的意思是在调用它们之前定义它们。 最佳答案 函数定义(和 var 语句)被
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
我注意到Flask tutorial涉及到点的使用。看起来它只是用于在本地创建一个轮子,这将使服务器上的设置变得更容易,但作为一个网络开发新手,我很好奇:是否有人真的会一路将他们的网站上传到像 PyP
我一直在阅读有关 jquery live event 的内容,但仍然有点困惑?使用它有什么好处? http://docs.jquery.com/Events/live 我知道它与绑定(bind)类似,
这是我的故事:我已将我的应用迁移到 AndroidX,因为我需要从网上找到的库中获取一些新功能。 问题:我目前遇到了一些问题,因为我现在需要为 Cordova 开发一个插件来实现该应用程序的一部分。
在使用 RAD 或一般不使用单元测试时使用依赖注入(inject)是否有任何好处? 最佳答案 是的,有以下几个好处: 减少依赖 减少依赖携带 更多可重用代码 更多可测试代码 更具可读性的代码 更多引用
我目前正在构建一个通过 MSI Windows Installer 分发的产品。我们的客户正在使用不同的形式(例如我们在他们自己的 MSI 中)集成该产品,使用 Bootstrap /链接器(如 Wi
有人声称 Scala 的类型系统是图灵完备的。我的问题是: 这有正式的证据吗? 简单的计算在 Scala 类型系统中会是什么样子? 这对 Scala 这种语言有什么好处吗?与没有图灵完备类型系统的语言
我开始尝试使用 React,我注意到我正在制作的简单应用程序全部使用 JS。我的 html 页面只是一个空的 body 标签! 所以我有几个问题,因为我是这个框架的新手。 我的整个应用程序应该基本上都
我们有一个相当大的基于 Windows 的 1.1 .NET 应用程序,我们正在考虑升级到 2.0。我们考虑更新的主要原因是我们可以利用 Visual Studio 2008 进行项目的持续开发,以及
我有一个页面,其中内置了基于 ajax 的分页。分页用于页面中的“评论”功能。根据 Google 的网站管理员博客,具有 rel="next"和 rel="prev"值有利于 SEO。 我在头部添加了
我是一名优秀的程序员,十分优秀!