iOS编程:学习篇(五)

原创 2015年07月06日 22:21:06

Chapter 3 通过ARC管理内存

当程序执行某个某方法时,会从内存中名为栈(stack)的区域分配一块内存空间,这块空间成为帧(frame)。帧负责保存程序在方法内声明的变量的值。

堆(heap)是指内存中的另一块区域,和栈是分开的。堆包含了大量无序的活动对象,需要通过指针来保存这些对象在堆中的地址。
当应用向某个类发送alloc消息时,系统会从堆中分配出一块内存,其大小足够存放相应对象的全部实例变量。iOS应用在启动和运行时会持续创建需要的对象,如果堆的空间无限,则可以随意创建所需的对象,并且在应用运行时间不用释放。但是可供应用支票的堆空间是有限的。因此再需要某些对象时,就要将其释放掉。

指针变量与对象所有权

指针变量暗含了对其所指向的对象的所有权。

  • 当某个方法有一个指向某个对象的局部变量时,可以称该变量拥有变量所指向的对象
  • 当某个对象有一个指向其他对象的实例变量时,可以称该对象拥有该实例变量所指向的对象。

对象所有权概念可以帮助我们决定是否应该释放某个对象并回收该对象占有的内存。

  • 如果某个对象没有拥有者,就应该将其释放掉。没有拥有者的对象是孤立的,程序无法向其发送消息。保留这样的对象只回浪费宝贵的内存空间,导致内存泄露(memory leap)。
  • 如果某个对象有一个或多个拥有者,就必须保留不能释放。如果释放了某个对象,但是其他对象或方法仍然有指向对象的指针,那么想该指针指向的对象发送消息就会使应用崩溃。释放正在使用的对象的错误成为过早释放。指向不存在对象的指针称为空指针(danging pointer)或者空引用(danging reference)。

    哪些情况会使对象失去拥有者

  • 当程序修改某个指向特定对象的变量并将其指向另一个对象时。

  • 当程序将某个特定对象的变量设置为nil。
  • 当程序释放对象的某个拥有者时。
    方法或函数可以通过局部变量成为对象的拥有者。当程序执行完某个方法,将其帧弹出栈时,就会释放该方法的所有局部变量。在这些变量中,如果有指向其他的对象的指针变量,那么这些对象就会失去一个拥有者。
  • 当从collection类中删除对象时。

所有权链(ownership chains)

因为对象可以拥有其他对象,后者也可以再拥有别的对象,所以释放一个对象可能会产生连锁反应,导致多个对象失去拥有者,进而释放对象并归还内存。

强引用与弱引用

只要指针指向了某个对象,那么相应的对象就会多一个拥有者,并且不会被程序释放。这种指针特性称为强引用(strong reference)
程序也可以选择让指针变量不影响其指向对象的拥有者个数。这种不会改变对象拥有者个数的指针特性称为弱引用(weak reference)

强引用循环(strong reference cycle 或 保留循环):当两个或两个以上的对象相互之间有强引用特性的指针关联时,就会产生强引用循环。

将强引用循环解除前,需要将新创建的两个对象之间某个指针改为弱引用特性。在决定将哪个指针改为弱引用前,可以先为存在强引用循环问题的多个对象决定相应的父子关系。确定父子关系后,就可以让父对象拥有子对象,并确保不会拥有负对象。
通常情况下,父对象应该使用工具有强引用特性的指针,指向子对象。而子对象则应该使用具有弱引用特性的指针,指回父对象。如果某个子对象需要有一个指针,指向父对象的父对象,那么该指针必须具有弱引用特性。

属性

通过属性也可以为类声明实例变量并实现相应的存取方法。
声明一个属性,等于隐含地为相应名称的实例变量声明一对存取方法。

属性的名字是实例变量的名字去掉下划线,编译器根据属性生成实例变量时会自动在变量名加上下划线。声明属性还可以为相应的存取方法生成代码。

属性的特性

任何属性都可以有一组特性(attribute),用于描述相应存取方法的行为。

在Xcode4.5及以后的版本中,可以省略@synthesize ,编译器会自动帮你加上getter 和 setter 方法的实现,并且默认会去访问_age这个成员变量,如果找不到_age这个成员变量,会自动生成一个叫做 _age的私有成员变量。

学习编程道路上的书籍之Python篇

学习编程专栏连载编程学习编程道路上的入门书籍之Python篇,文章中的所有推荐的书籍均来自知乎社区大牛力荐书籍、豆瓣评分较高书籍、各语言社区比较热门书籍以及京东、亚马逊、当当热销书籍的重合书籍。...
  • Ly4wU5giY
  • Ly4wU5giY
  • 2016年10月29日 19:16
  • 56

iOS编程学习五

今天又花了一共一个小时顺利完成了苹果官网上例子的最后两个练习,增加修改删除功能,以及持久化。总体感受,swift和oc相比,简洁方便了很多。这个完整的例子虽然简单,但是麻雀虽小五脏俱全,做的也非常有意...
  • starshus
  • starshus
  • 2017年06月29日 21:42
  • 158

Netty5源码分析(八) -- 总结

这个系列通过七篇文章,结合Netty5的原代码 1. 分析了服务器绑定端口的过程,从整体上可以看到Netty执行的流程和主要组件 2. 分析了Netty的线程模型,解析了Reactor模式。很多人...
  • ITer_ZC
  • ITer_ZC
  • 2014年09月23日 10:34
  • 2465

iOS学习之路(三)--界面篇

界面开发是App开发中非常重要的部分,因为呈现给用户的就是一个个的界面,界面的美观和用户体验的良好都是决定App存活的关键。 但是界面开发的学习没有什么捷径,只能同步不断的学习了解各个控件的使用,以及...
  • liyux4869
  • liyux4869
  • 2016年03月28日 17:11
  • 605

[Qt学习篇]UDP编程

QUdpSocket提供了UDP套接字API,用来接收和发送UDP数据报。 QUdpSocket类最通用的使用方式是:用bind()函数绑定一个IP地址和端口Port,然后调用writeDatagra...
  • u013686019
  • u013686019
  • 2014年08月18日 12:51
  • 6848

Spark编程指南入门之Java篇六-RDD持久化介绍

10. RDD持久化 Spark其中一个重要的功能是持久化(或缓存)数据到内存。当持久化一个RDD时,每一个节点会把计算后的分区数据保存在内存里面,然后后续的操作可以直接重用内存里的数据。这样可以提...
  • gangchengzhong
  • gangchengzhong
  • 2017年01月12日 16:47
  • 1008

《孙子兵法》之谋攻篇

 《孙子兵法》之谋攻篇2007-7-12本篇主要说明作战筹划应当注意的几个重要的原则,即追求至善的全胜原则、“将能而君不御”统御原则、知彼知己的认识论原则。 孙子曰:凡用兵之法,全国为上1,破国次之;...
  • cmu_hua
  • cmu_hua
  • 2007年07月17日 14:11
  • 3395

鸟哥的Linux私房菜 基础学习篇(第三版)

第零章 计算器概论 1 计算机:辅助人脑的好工具 接收用户指令与数据,经由中央处理器的数学与逻辑单元运算处理后,以产生或存储成有用的信息。 1.1 计算器的五大单元 输入单元,CPU控制单元,CPU算...
  • niuzhihuan
  • niuzhihuan
  • 2015年08月03日 20:17
  • 1031

体验云编程——IOS脚本学习门户

云编程云编程,浏览器打开就能够进行代码的编写运行,用户体验媲美桌面IDE的代码编辑器。l  在线代码编写,代码高亮显示,函数自能感知提示l  在线代码直接运行,控制台输出l  支持代码断点变量查看l ...
  • hunkcai
  • hunkcai
  • 2014年01月04日 18:22
  • 4737

iOS编程:学习篇(九)

UITabBarControllerUITabBarController对象可以保存一组视图控制器。UITabBarController对象还会在屏幕底部显示一个标签栏,标签栏会有多个标签项,分别对应...
  • BruceLee_csdn
  • BruceLee_csdn
  • 2015年08月11日 23:04
  • 231
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS编程:学习篇(五)
举报原因:
原因补充:

(最多只允许输入30个字)