首先看一下官方文档的介绍Managing the Lifetimes of Objects from Nib Files

Each time you ask the NSBundle or NSNib class to load a nib file, the underlying code creates a new copy of the objects in that file and returns them to you. (The nib-loading code does not recycle nib file objects from a previous load attempt.) You need to ensure that you maintain the new object graph as long as necessary, and disown it when you are finished with it. You typically need strong references to top-level objects to ensure that they are not deallocated; you don’t need strong references to objects lower down in the graph because they’re owned by their parents, and you should minimize the risk of creating strong reference cycles.

用谷歌大致翻译了一下: 每次请求NSBundle或NSNib类加载nib文件时,底层代码都会在该文件中创建对象的新副本并将它们返回给您。 (nib加载代码不会从先前的加载尝试中回收nib文件对象。)您需要确保在必要时维护新的对象图,并在完成它时将其取消。您通常需要对顶级对象的强引用,以确保它们不会被释放;您不需要对图表中较低的对象进行强引用,因为它们由父母拥有,您应该尽量减少创建强引用周期的风险。


  • 因为当我们将控件拖到Storyboard上,相当于新创建了一个对象,只是关联到viewcontroller,而不是添加到viewcontroller.这个对象是加到viewcontroller的view上,view有一个subViews属性,[self.view addSubView:xxx], 这个属性是一个数组,里面是这个views的所有子view,而我们加的控件就位于这个数组中,那么说明,实际上我们的控件对象是属于views的,也就是说views对加到它上面的控件是强引用, 这个时候self.view已经对xxx 强引用过了,self.view才是持有xxx的对象。这样子才符合引用计数的规则。所以直接IBOutlet顶级view的时候肯定是strong的。当我们使用Outlet属性的时候,我们是在viewController里面使用,而这个Outlet属性是有view来进行强引用的,我们在viewController里面仅仅是对其使用,并没有必要拥有它,所以这个weak是views里面的子view对于viewController来说的.

  • 如果将weak改为strong,也是没有问题的,如果非要说有什么问题,官方文档最后 “and you should minimize the risk of creating strong reference cycles.” 您应该尽量减少创建强引用周期的风险。也就是说,没有必要做可能会产生风险的事情,对于一个view也就是使用周期风险. 官方文档下面还有一句: The strong outlets are frequently specified by framework classes (for example, UIViewController’s view outlet, or NSWindowController’s window outlet).意思就是从官方框架和使用模式上考虑这是最适合的,最好的方式.

IBOutlet 为什么默认是用weak来修饰的?相关推荐

  1. java 访问修饰符不写默认是什么_Java访问修饰符有哪些?权限的区别?

    Java 语言中有四种权限访问控制符,能够控制类中成员变量和方法的可见性. public 被 public 修饰的成员变量和方法可以在任何类中都能被访问到. 被 public 修饰的类,在一个 jav ...

  2. java变量无修饰符默认类型,Java变量与修饰符

    Java变量类型 java变量定义:type variablename,[variable name = value]=value ? 局部变量:方法中的变量 ? 局部变量声明在方法中 ? 访问修饰符 ...

  3. swift 引用其他类_浅谈swift中闭包修饰符 weak?unowned? 或什么都不用

    浅谈swift中闭包修饰符 weak?unowned? 或什么都不用 平常的开发中,clourse是我们iOSr绕不过去的坎儿. 苹果本身也很重视闭包,像之前的一些老的target-action类型的 ...

  4. Objective-C之MRC、ARC模式下,属性修饰关键字strong、retain、assign、weak的区别和联系...

    平时用strong.retain.assign.weak这几个关键字的时候,也没有过多的在意,下边就MRC.ARC模式下,每个关键字做一下总结.为了简明期间,采用表格的形式进行展示. MRC ARC ...

  5. Java-Day11 面向对象遍程的入门 (类属性的默认值、构造方法、类的成员、static关键字、类的成员加载顺序、Java(权限)访问修饰符)

    目录 1. 类的属性的默认值问题 2. 构造方法(Constructor) 3. 类的成员 3.1 类的成员之一:属性 3.2 UML类图 4. static关键字 5. 类的成员加载(运行)顺序 6 ...

  6. ARC指南 strong和weak指针

    一.简介 ARC是自iOS 5之后增加的新特性,完全消除了手动管理内存的烦琐,编译器会自动在适当的地方插入适当的retain.release.autorelease语句.你不再需要担心内存管理,因为编 ...

  7. 关于@property()的那些属性及ARC简介【nonatomic,atomic,assign,retain,strong,weak,copy。】

    @property()常用的属性有:nonatomic,atomic,assign,retain,strong,weak,copy. 其中atomic和nonatomic用来决定编译器生成的gette ...

  8. Objective-C中,ARC下的 strong和weak指针原理解释

    Objective-C中,ARC下的 strong和weak指针原理解释 提示:本文中所说的"实例变量"即是"成员变量","局部变量"即是& ...

  9. iOS cop/assign /strong/weak

    1.OC中字符串为什么要用Copy 在iOS开发中,我们在定义一个NSString的时候都会用copy来修饰, @property (nonatomic, copy)NSString *str; 那为 ...

最新文章

  1. linux db2 修改日志路径,db2中更改日志文件大小及其个数
  2. 模拟一下goldengate中断后,重新同步操作
  3. DevExpress- XPO入门(1)
  4. 《C语言及程序设计》实践参考——当年第几天(数组方案)
  5. python常用输入输出の方法
  6. 想要成为架构师?先看看这些条件满不满足!
  7. 华为副总裁回应应用删除用户图片;美国拟允许华为参与 5G 标准建设;Firefox 76.0 发布​ | 极客头条...
  8. loadrunner——参数化
  9. iOS视频播放器开发
  10. 简述微处理器、微型计算机、微机系统的组成和三者间关系?
  11. 什么是服务器安全性?
  12. 22牛客多校1 J.Serval and Essay (启发式合并)
  13. 阿里巴巴2018秋招总结
  14. 使用JIRA管理项目工单
  15. HM编码器代码阅读(13)——帧间预测之AMVP模式(一)总体流程
  16. 变分自编码AVE器生成图像(Pytorch)
  17. vue-cli3使用iview
  18. echarts 中国地图的下钻
  19. 高僧斗法 nim博弈
  20. 如何做视频教程笔记(以吴恩达课程为例)

热门文章

  1. GetByteArrayElements和GetByteArrayRegion的使用示例
  2. 类的应用: 1.bmi体重指数计算器 2.taxi出租车费用计算器 3.猜数字 4.税率
  3. 手把手教你测试电商软件的好与坏
  4. 电路板维修测试仪如何使用?
  5. javascript实现弹出层
  6. 运维数智化时代——京东数科AIOps落地实践(一)
  7. 手机怎么拍照识别文字?分享一个简单的方法
  8. 05组-选题与需求分析报告
  9. python抓取百度妹子图
  10. 卓尔智联低代码解决方案入选2021年湖北省区块链十大优秀应用案例