objective-C基础教程(第2版)-第九章笔记

本文详细介绍了Objective-C中的内存管理机制,包括引用计数、autorelease、自动释放池的概念和工作原理。讨论了ARC(Automatic Reference Counting)如何自动管理对象生命周期,并解释了在循环引用情况下的解决策略,如弱引用和归零弱引用。此外,还提及了异常处理在OC中的应用和限制。

OC内存管理

cocoa采用引用计数进行内存管理,即当访问一个对象是该对象的保留计数器值+1,当结束访问后对象的保留计数器-1

当使用alloc,new方法或通过copy消息创建一个对象是,对象的保留计数器值设置为1,改变这个值可以通过发送retain消息+1, release消息-1
当一个对象的保留计数器归0即将销毁时,oc会自动向对象发送一条关于dealloc的消息

[obj retain]; // 保留数 + 1
[obj release]; // 保留数 - 1
[obj retainCount]; // 获取保留数

OC的自动释放池
NSObject提供了一个叫做autorelease的方法将预先设定一条会在某个时间发送release消息,其返回值是接收这条消息的对象,当对该对象发送autorelease消息时实际上是将该对象添加到自动释放池中,当自动释放池被销毁时将向该池中的所有对象发送release消息
oc中可通过@autoreleasepool(推荐)或NSAutoreleasePool对象创建一个自动释放池

// 花括号中的代码将会被放入新池子中;推荐关键字方法,比对象更
关键字方法 @autoreleasepool{}
// 创建和释放该对象之间的代码会使用新池子
对象NSAutoreleasePool

自动释放池以栈的形式实现,新创建的自动释放池会被添加到栈顶,接收autorelease消息的对象将被放入栈顶的自动释放池中


ARC自动引用计数,ARC会最终你的对象并在编译器中帮你插入retain和release,ARC不是垃圾回收器
在这里插入图片描述
在代码中使用ARC需满足以下三个条件

  • 能明确哪些对象需要进行内存管理
  如C型数组不是可保留对象使用无法使用ARC特性
  • 能表明如何去管理对象
必须能对某个对象的保留计数器进行+1-1的操作,也就是说NSObject类的子类都能进行内存管理
  • 有可行的办法传递对象所有权
传递对象是,你的程序必须能够在调用者和接收者之间传递所有权

当用指针指向某个对象时,你管理它的内存就拥有该对象的强引用,如果没有管理则拥有的是弱引用

当出现循环引用时,如下图,持有一个A对象,A对象内部持有一个B对象,同时B对象又拥有指向A的引用,则当外部不再指向A对象时,会导致A,B对象由于循环引用的问题没有被释放,因此需要弱引用来破解
在这里插入图片描述
将B指向A的引用改为弱引用,因为是弱引用所以保留计数器的值不会增加,当外部释放A时提示也会释放B
在这里插入图片描述

但是当三个对象相互引用如下图时
在这里插入图片描述
当A释放了B时,C仍将拥有B的弱引用,直接使用它会导致问题,其指向的地方已经没有有效值了。这种情况的解决方案为让对象自己去清空弱引用的对象,这种特殊的弱引用被称为归零弱引用,当指向的对象释放后,这些若引用会被设为零(nil)
归零弱引用的使用

声明变量是使用__weak关键字或对属性使用weak特性@property(weak) 
同样强引用可以用__strong或strong特性

ARC和垃圾回收机制无法一同使用

异常NSException
OC中的异常处理感觉没太大用处,因为异常处理无法捕捉内存泄露引起的崩溃,而这也是iOS应用中最常重新的崩溃,所以就大致记录下
在这里插入图片描述
抛出异常可以用@throw 异常对象或[异常对象 raise],但两者不能同时使用,raise只对NSException对象有效,而@throw可以用在其他对象上。
@catch异常代理代码中可以直接使用@throw重复抛出异常而无需指定异常对象

@try建立一次不会产生消耗单捕捉异常会消耗大量的资源并影响程序运行的速度,另外异常也需要内存管理

中文名: Objective-C基础教程 作者: Mark Dalrymple Scott Knaster译者: 高朝勤 杨越 刘霞图书 分类: 软件 资源格式: PDF 本: 扫描社: 人民邮电出社 书号: ISBN: 9787115208774 发行时间: 2009年08月 地区: 大陆 语言: 简体中文 简介: 内容简介 Objective-C是扩展C的面向对象编程语言,也是iPhone开发用到的主要语言。本书结合理论知识与示例程序,全面而系统地讲述Objective-C编程的相关内容,包括Objective-C在C的基础上引入的特性和Cocoa工具包的功能及其中的框架,以及继承、复合、源文件组织等众多重要的面向对象编程技术。附录中还介绍了如何从其他语言过渡到Objective-C。   本书适合各类开发人员阅读。 内容截图 目录: 第1章 启程.1 1.1 预备知识1 1.2 历史背景1 1.3 内容简介2 1.4 小结3 第2章 对C的扩展4 2.1 最简单的Objective-C程序4 2.2 解构HelloObjective-C程序7 2.2.1 #import7 2.2.2 NSLog()和@"字符串"8 2.3 布尔类型10 2.3.1 BOOL强大的实用功能11 2.3.2 比较13 2.4 小结14 第3章 面向对象编程基础知识15 3.1 间接15 3.1.1 变量与间接16 3.1.2 使用文件名的间接18 3.2 在面向对象的编程中使用间接24 3.2.1 过程式编程24 3.2.2 实现面向对象编程29 3.3 学习有关的术语33 3.4 Objective-C中的OOP34 3.4.1 @interface部分34 3.4.2 @implementation部分38 3.4.3 实例化对象40 3.4.4 扩展Shapes-Object41 3.5 小结43 第4章 继承45 4.1 为何使用继承45 4.2 继承语法48 4.3 继承的工作机制51 4.3.1 方法调度51 4.3.2 实例变量53 4.4 重写方法55 4.5 小结57 第5章 复合58 5.1 什么是复合58 5.1.1 Car程序58 5.1.2 自定义NSLog()59 5.2 存取方法62 5.2.1 设置发动机的属性64 5.2.2 设置轮胎的属性64 5.2.3 跟踪汽车的变化66 5.3 扩展CarParts程序67 5.4 复合还是继承68 5.5 小结69 第6章 源文件组织70 6.1 拆分接口和实现部分70 6.2 拆分Car程序73 6.3 使用跨文件依赖关系75 6.3.1 重新编译须知75 6.3.2 让汽车开动77 6.3.3 导入和继承79 6.4 小结80 第7章 深入了解Xcode82
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值