iOS property strong/weak

探讨iOS开发中IBOutlets属性使用strong还是weak的最佳实践。随着苹果在WWDC 2015上的建议更新,大多数情况下推荐使用strong,除非需要避免内存循环。文章解析了这一变化的原因及对内存管理的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最重要的放在前面,IBoutlet,官方以前推荐weak,现在推荐strong! 


先说按照weak,我们应该知道的原理:


如果使用StoryBoard托线,控件用weak

因为stroyboard中会有强引用对象,然后用_weak,不会出现直接释放的问题


如果用代码创建,控件用strong

直接用strong,强引用生成的对象.


然后,再看变化,根据stackOverflow上关于这个问题的提问,  Should IBOutlets be strong or weak under ARC?


现在这个提问的置顶回答明确提出,2015 WWDC上,推荐值为strong(更加说服力的是,回答问题的人,还在推特上联系了IB项目组的一个开发工程师,人家确认是strong)

下面就是置顶回答:

The current recommended best practice from Apple is for IBOutlets to be strong unless weak is specifically needed to avoid a retain cycle. As Johannes mentioned above, this was commented on in the "Implementing UI Designs in Interface Builder" session from WWDC 2015 where an Apple Engineer said:

And the last option I want to point out is the storage type, which can either be strong or weak. In general you should make your outlet strong, especially if you are connecting an outlet to a subview or to a constraint that's not always going to be retained by the view hierarchy. The only time you really need to make an outlet weak is if you have a custom view that references something back up the view hierarchy and in general that's not recommended.

I asked about this on Twitter to an engineer on the IB team and he confirmed that strong should be the default and that the developer docs are being updated.

https://twitter.com/_danielhall/status/620716996326350848https://twitter.com/_danielhall/status/620717252216623104

现在API文档关于IBoutlet的解释依然是weak,因为还没更新,说是将更新...

而这个提问最下方的另一个问答,更是直接指出了WWDC哪里说明了这一点,有兴趣的可以去看视频,(上面黄块的话,就是工程师的原话)

The evidence on their WWDC session is in session 407 - Implementing UI Designs in Interface Builder and starts at 32:30. 


至于从weak到strong的变化的原因,我的理解是

首先看一个变化:

- (void)viewDidUnload这个方法已经废弃了,从这个方法在API文档的discussion中了解到,在ios5以及前面:

In iOS 5 and earlier, when a low-memory condition occurred and the current view controller'€™s views were not needed, the system could opt to call this method after the view controller'€™s view had been released. This method was your chance to perform any final cleanup. If your view controller stored separate references to the view or its subviews, you could use this method to release those references. 

清除视图的时候,需要清引用,如果是强引用,就必须清,否则会影响到view的清理,也就应该会影响到nib上托的控件清理.

但是ios6以后:

In iOS 6 and later, clearing references to views and other objects in your view controller is unnecessary.

不需要清理了.为什么?我猜测,以前是只清nib不清控制器对象,所以,视图不加载的时候,要通过unload置nil.

而现在应该是nib,控制器对象都清.这样的话,直接把IBoutlet的父视图的控制器清了,父视图的所有者就没有了,完蛋,那么IBoutlet变量的所有者就没有了,完蛋,从上而下的清除. 

这样也就不会因为strong,影响到需要清除nib的时候,清除nib了.

而且,IB,对于nib的管理,也可以根据是否有变量strong引用,来合理清除暂时不用的nib了.

以上只是一种合理分析,因为这已经不是语法层的问题,这是实现层的问题,我们只能做出猜测.

用stackOverflow最后一名回答者的话(他也提出一种关于nib的解释,但我没看懂....)

Still it would be nice to get a deeper explanation from Apple.


资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值