objective-c快速入门教程(三)

看到此篇文章,就当作你已经学习好了面向对象的基本。

(我认为这种理论概念的东西,没有任何一位老师一说就就会懂。

这里就不提我当年的老师多么NB,他说了几次我都没懂,可能是我笨。

大家还是自己领悟,主要还是多敲代码,这样更容易理解为什么要面向对象)

我们现在要介绍的是oc  关于内存的一系列介绍。

之前你也看到在第一片文章中。@autoreleasepool

这个东西是在Xcode4.2及之后的版本中由于引入的ARC(Automatic Reference Counting)机制。

跟java的GC功能相同。

但是是两码事,ARC是编译时编译器“帮你”插入了原本需要自己手写的内存管理代码,

而非像GC一样运行时的垃圾回收系统。而是程序编译时Xcode可以自动给你的代码添加内存释放代码。

但是在ObjC中没有垃圾回收机制,那么ObjC中内存又是如何管理的呢?

其实在ObjC中内存的管理是依赖对象引用计数器来进行的:

在ObjC中每个对象内部都有一个与之对应的整数(retainCount),

叫“引用计数器”,当一个对象在创建之后它的引用计数器为1,

当调用这个对象的alloc、retain、new、copy方法之后引用计数器自动在原来的基础上加1

(ObjC中调用一个对象的方法就是给这个对象发送一个消息),

当调用这个对象的release方法之后它的引用计数器减1,

如果一个对象的引用计数器为0,则系统会自动调用这个对象的dealloc方法来销毁这个对象。

所以 只要alloc init后 不用的对象一定要release 否则就会造成内存泄露。

而java的内存则适用一种比较复杂的内存释放机制。

简单介绍下java的内存,java任何一款虚拟机都没有同上面类似的清理方法。

java虚拟机的思路是一切获得对象都能追溯到期存活的堆栈或静态储存区,

遍历所有的引用就能找到所有活得对象。对发现的每一个引用必须追踪到它所引用的对象,

然后是此对象包含的所有引用,如此反复。直到根源堆栈和静态区形成的网络全部被访问到。

在这种方法下,有一种自适应的垃圾回收技术。如何找到存活对象取决于不同的虚拟机。

有一种发方法叫做停止-复制。它意味着先暂停程序(它不属于后台垃圾清理)然后将

他们全部拷贝到一块 新分离的堆内存中。之后删除原来的堆内存全部对象。

这样开始肯能效率比较慢(两个原因.1是要有两个堆 2是两个堆来回折腾),当程序慢慢稳定后。

会转换成 标记-清理

“标记-清扫”所依据的思路同样是从堆栈和静态存储区出发,遍历所有的引用,进而找出所有存活的对象。

每当它找到一个存活对象,就会给对象设一个标记,这个过程中不会回收任何对象。

只有全部标记工作完成的时候,清理动作才会开始。

在清理过程中,没有标记的对象将被释放,不会发生任何复制动作。

所以剩下的堆空间是不连续的,垃圾回收器要是希望得到连续空间的话,就得重新整理剩下的对象。

想想java的内存管理机制就够高端、省心。

这里我们既然了解了oc 和java 的内存回收机制,就不得不探讨下这个对象初始化分配内存的内容了。

初始化关键词:new
alloc init

在实际开发中很少会用到new,一般创建对象咱们看到的全是[[className alloc] init]

这是为什么呢?

不知大家发现了没有:如果使用new的话,初始化方法被固定死只能调用init.不能调用我们准备好的别的初始化方法

这样是十分不灵活的。

但是除了这种默认初始化外还有别的不同么。答案是当然有

借助源码我们详细看看他们的区别

+ new

{

id newObject = (*_alloc)((Class)self, 0);

Class metaClass = self->isa;

if (class_getVersion(metaClass) > 1)

return [newObject init];

else

return newObject;

}

//而 alloc/init 像这样:

+ alloc

{

return (*_zoneAlloc)((Class)self, 0, malloc_default_zone());

}

- init

{

return self;

}

区别只在于alloc分配内存的时候使用了zone.

这个zone是个什么东东呢?

它是给对象分配内存的时候,

把关联的对象分配到一个相邻的内存区域内,

以便于调用时消耗很少的代价,提升了程序处理速度;

时间: 2024-10-16 06:09:31

objective-c快速入门教程(三)的相关文章

Objective C 快速入门学习三

1.数据类型 和C语言基本一样. 有一个特别数据类型id,可以储存任何类型的对象,它是实现多态和动态绑定的基础. Objective-C 2.程序结构 Objective-C和C的程序结构一模一样,具体用法相同. 顺序.循环.选择 3.基本上Objective-C兼容了C语言所有特点,包括数组.结构.字符串.联合,它们不是对象,面向过程式.建议直接使用相关框架下的相关类,面对对象编程. Objective C 快速入门学习三

ThinkPHP3快速入门教程三:查询语言

一.查询语言简介: ThinkPHP内置了非常灵活的查询方法,可以快速的进行数据查询操作,查询条件可以用于读取.更新和删除等操作,主要涉及到where方法等连贯相关方法操作即可, 此框架查询系统可以解决不同数据库的差异性,因些我们把框架的这一查询方式称之为查询语言.使其查询操作更加简单易懂. 二.查询方式: ThinkPHP可以支持直接使用字符串作为查询条件,但是大多数情况推荐使用索引数组或者对象来作为查询条件,因为会更加安全. 1.使用字符串作为查询条件(最传统的方式,但是安全性不高),例如:

Jmeter 快速入门教程(三-3) -- 使用参数化

参数化:简单的来理解一下,我们录制了一个脚本,这个脚本中有登录操作,需要输入用户名和密码,假如系统不允许相同的用户名和密码同时登录,或者想更好的模拟多个用户来登录系统. 这个时候就需要对用户名和密码进行参数化,使每个虚拟用户都使用不同的用户名和密码进行访问. 前提: 假如,我们录制好了一个脚本(可以用badboy工具录制),在jmeter中打开,找到有用户名和密码的页面.如下: 1. 我们需要“参数化”的数据,这里我用记事本写了五个用户名和密码,保存为.dat格式的文件. 我将这个文件放在了我的

Jmeter 快速入门教程(三-2) -- 设置集结点

集合点:简单来理解一下,虽然我们的“性能测试”理解为“多用户并发测试”,但真正的并发是不存在的,为了更真实的实现并发这感念,我们可以在需要压力的地方设置集合点, 还拿那个用户和密码的地方,每到输入用户名和密码登录的地方,所有的虚拟用户都相互之间等一等,然后,一起访问.(红军排长说:等一等!大家一起冲啊!这样给敌人的压力是很大的.嘻嘻!) 1. 接着之前创建的脚本,右键点击 step1---->定时器---->Synchronizing Timer 这样子就添加了一个“集合点”,下面来设置一下集

Velocity快速入门教程

Velocity快速入门教程-脚本语法详解(转) 1.变量 (1)变量的定义: #set($name = "hello")      说明:velocity中变量是弱类型的. 当使用#set 指令时,括在双引号中的字面字符串将解析和重新解释,如下所示: #set($directoryRoot = "www" ) #set($templateName = "index.vm" ) #set($template = "$directoryR

专为设计师而写的GitHub快速入门教程

原文出处: Kevin Li 在互联网行业工作的想必都多多少少听说过GitHub的大名,除了是最大的开源项目托管平台,许多企业也都是用GitHub来协同开发工作,当然我 们彩程也是其中之一.笔者最初决定学习Git也是因为在团队内部设计方案初步被开发出来后,难免会有一些细节需要调整,而为了调整几像素的问题再求前端工 程师出马,其实是很影响整体效率的,所以希望通过学习GitHub好在必要的时候直接参与开发,能发挥自己的一点CSS技术以更直接快速的解决问题. 但是期间竟然发现网上无一篇为设计师而备的G

BootStrap入门教程 (三)

上讲回顾:Bootstrap的基础CSS(Base CSS)提供了优雅,一致的多种基础Html页面要素,包括排版,表格,表单,按钮等,能够满足前端工程师的基本要素需求. Bootstrap作为完整的前端工具集,内建了大量的强大优雅可重用的组件,包括按钮(Button),导航(Navigation),标签(Labels),徽章(Badges),排版(Typography),缩略图( thumbnails),提醒(Alert),进度条(progress bar),杂项(Miscellaneous).

Objective C 快速入门学习五

<一>继承和多态 @class Complex 声明类(同C++) 子类函数成员 super 访问父类 同C++类似 1.通过继承 在子类中添加新方法 2.通过继承 在子类中添加新成员 3.通过继承 实现多态(实现比较简单,通过Id通用类型作为父类) 4.重载 5.抽象类abstract作用:创建子类更容易:提供了处理所有派生子类的公共接口:抽象方法制定了标准协议,规范子类必须实现. 6.通用类型id,编译时不会做类型检查,在运行时才会动态绑定具体类型,指出错误. 静态类型在编译阶段就会指出错

指示灯组与3个复位按钮的介绍Arduino Yun快速入门教程

指示灯组与3个复位按钮的介绍Arduino Yun快速入门教程 1.4.2  指示灯组 指示灯组的放大图如图1.5所示. 图1.5  指示灯组 各个指示灯对应的功能如下: q  RX:对应于0号端口,串行通讯的接收指示,在接收数据时闪烁: q  TX:对应于1号端口,串行通讯的发送提示,在发送数据时闪烁: q  L13:连接在13号端口,当13号端口为高电平时被点亮: q  WAN:有线网络连接指示,在网线有数据交换的时候点亮: q  ON:电源指示: q  WLAN:WIFI指示,同时也可以用

Apple Watch开发快速入门教程

Apple Watch开发快速入门教程 试读下载地址:http://pan.baidu.com/s/1eQ8JdR0 介绍:苹果为Watch提供全新的开发框架WatchKit.本教程是国内第一本Apple Watch开发教程,全面讲解WatchKit的各个方面,帮助读者更为快速的掌握Watch开发方式和流程. 目录 第1章  开发环境--Xcode 1 1.1  苹果账号 1 1.1.1  苹果账号的成员分类 1 1.1.2  注册免费的苹果账号 1 1.1.3  注册收费的苹果账号 4 1.2