我们应该在Swift中使用[unowned self]?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (7)
  • 关注 (0)
  • 查看 (182)

在WWDC 2014会议上403IntermediateSWIFTtranscript,下面是幻灯片

演讲者说,如果我们不用[unowned self]在那里,这将是一个内存泄漏。这是否意味着我们应该一直使用[unowned self]内部关闭?

ViewController的第64行,SWIFT天气应用程序的快速,我不使用[unowned self].但是我使用一些@IBOutlet就像self.temperatureself.loadingIndicator.可能没事,因为@IBOutlets我定义的是weak但是为了安全,我们应该一直用[unowned self]?

class TempNotifier {
  var onChange: (Int) -> Void = {_ in }
  var currentTemp = 72
  init() {
    onChange = { [unowned self] temp in
      self.currentTemp = temp
    }
  }
}
提问于
用户回答回答于

以下是来自苹果开发者论坛描述了美味的细节:

unownedVSunowned(safe)VSunowned(unsafe)

unowned(safe)是一个不拥有的引用,它在访问时断言对象仍然是活动的。这有点像一个弱的可选引用,它被隐式地打开x!每次被访问。unowned(unsafe)就像__unsafe_unretained在ARC中,它是一个不拥有的引用,但是没有运行时检查该对象是否仍然在访问中,因此悬空引用将到达垃圾内存中。unowned的同义词unowned(safe)目前,但目的是将其优化为unowned(unsafe)-Ofast禁用运行时检查时生成。

unownedVSweak

unowned实际使用的实现比weak本机SWIFT对象包含两个引用计数,以及unowned引用会使无主参考计数而不是参考计数对象的参考计数达到零,但直到无主参考计数也是零。这会使内存在无主引用时保留的时间稍长一些,但通常在以下情况下不会出现问题unowned之所以使用,是因为相关对象无论如何都应该具有几乎相等的生存期,而且它比用于对弱引用进行归零的基于侧表的实现要简单得多,开销也低得多。

现代Swift在内部使用与unowned相同的机制。 所以这个比较是不正确的,因为它比较了Objective-C和Swift之间的弱点。

原因

在拥有达到0的引用之后,保持内存存活的目的是什么?如果代码在重新初始化对象之后试图使用非拥有的引用对其进行操作,会发生什么情况?内存保持活动,以便其保留计数仍然可用。这样,当有人试图保留对未拥有对象的强引用时,运行时可以检查强引用计数是否大于零,以确保保留该对象是安全的。拥有或不拥有对象所持有的引用会发生什么情况?当对象被重新初始化时,它们的生存期是否与对象分离,还是它们的内存也被保留,直到在释放最后一个非拥有引用之后,该对象被解除分配?对象拥有的所有资源在释放对象的最后一个强引用并运行其deinit后立即释放。未拥有的引用只会保持内存的活力--除了具有引用计数的标头之外,其内容是垃圾的。

很兴奋是吧?

热门问答

linux如何限制单一ip对服务器的日访问量?

小爱同学

腾讯云 · 技术支持 (已认证)

推荐
您根据当前网站规模和业务了解下【网站管家 WAF】,企业站点可有效抵御恶意攻击,垃圾访问。 图片.png 您反馈网站短信验证码被盗刷,也可结合自己业务,可自行部署iptables进行手动拦截。或其他方式 例如您的网站是nginx,在web配置文件中开启配置HttpLimitR...... 展开详请

兼容性测试只能上传apk测试的吗?

WeTest质量开放平台团队专注游戏,提升品质
推荐

目前不支持公众号的兼容测试,还请知晓

关于群自动解散的问题?

安稳

腾讯科技 · 工单技术支持 (已认证)

推荐
您好,临时群是没有的。云通信的群组只有私有群(Private)、公开群(Public)、聊天室(ChatRoom)、音视频聊天室(AVChatRoom)和在线成员广播大群(BChatRoom)这五种。 您说的这个需求,思路:创建群组时,服务端记录一下时间,到达约定解散的时间以后,...... 展开详请

腾讯云短信接收方对控制台发出的短信做出回应,比如说回复短信“你好”,控制台是否能收到回复的内容?

您好,国内短信可在 短信控制台->国内短信->统计分析->短信记录->回复记录 查看用户回复的短信。 同时可配置文本短信回复回调,配置后会推送相关回复到用户服务器。 统计分析:https://cloud.tencent.com/document/product/382/18062...... 展开详请

不同账号的三台服务器用内网ping不通?

不同账号的服务器本来就已经独立划分,内网肯定是不通的,公网各自都有自己的公网,通是一定的,具体不同账号内网不通你可以参考私有网络VPC的定义。同地域不同账户的不同 VPC 相互隔离,但可以通过建立 同账户同地域对等连接同账户跨地域对等连接 实现内网互联。

对象存储单个文件大于5GB不能改变存储类型为归档存储,那么我上传的时候可以直接指定为归档存储吗?

Lew

腾讯云对象存储 · 工程师 (已认证)

推荐已采纳

可以的,coscmd upload a.txt a.txt -H "{'x-cos-storage-class':'Archive'}" -H 参数可以添加自定义的header

所属标签

扫码关注云+社区