Cocoa基础模式-两阶段创建

两阶段创建

两阶段创建模式将第一阶段(对象内存分配)与第二阶段(对象初始化)隔离开来。要有效的使用Cocoa必须遵从两阶段创建模式。

动机

  两阶段创建使程序员能在控制如何为对象分配内存的同时,为初始化实例提供了灵活性。两阶段创建在为Cocoa类创建子类的同时简化了实例初始化,并提供了简便的创建和初始化临时对象的方法。

未使用两阶段创建的缺点

  在类方法中,初始化实例有很多缺点。分配和初始化合并在一起会导致方法组合的出现,必须实现这些方法以处理分配对象可能使用的所有不同方法。

解决方案

  Cocoa的NSObject基类为新实例提供了两种分配内存的方法,即+(id)alloc 和 +(id)allocWithZone:(NSZone*)aZone.这两个方法会分别返回一个指针,指向新分配的内存块,以便存储执行此方法的类实例。

分区

    内存区是Cocoa的一个功能部件,它能为同时使用的对象或在计算机的地址空间中相邻的对象保存内存,以此提高应用程序性能。要解释对象在内存中的位置如何会影响性能,需要解释当应用程序需要的笔可用物理内存更多的内存时,会发生什么情况。
    Cocoa应用程序都有很大的可寻址内存。当应用程序动态地分配内存时,即使计算机中的所有物理内存都已经被占用,操作系统仍会提供内存。要适应此分配请求,操作系统会使用paging或swapping操作将一些物理内存中的内容复制到硬盘。之前包含数据的物理内存就可供应用程序使用,而原来的数据已经写入硬盘。
    如果又需要先前复制到硬盘的那块内存,操作系统会将另外一块物理内存复制到硬盘,并将原先的旧内存再调度回内存。即使内存在硬盘之间调度,操作系统仍然能够为每个应用程序映射地址空间到物理内存。操作系统的这一功能成为虚拟内存。
    由于从物理内存和硬盘中复制内容很消耗时间,因此使用虚拟内存会影响性能。过多的页面调度会降低系统的性能,这称为抖动。如果一起使用的两个或多个对象在内存中的存储位置离得很远,抖动发生的可能性就会增加,因此对象实例的内存分配位置很重要。

初始化已分配的内存

    一旦为新实例分配了内存,实例方法会立即初始化此内存。实例方法名为initializers,按照约定,开头字母是init,并返回一个id。分配内存和初始化基本上位于代码的同一行,模式如下:[[Class alloc]init].

总结

    将实例创建的分配和初始化阶段分开有很多好处。可以使用+alloc类方法的任何变体来分配实例,然后使用新实例的可用初始化方法,这样就能创建你自己的初始化方法,而无须提供所有分配方法的备用实现。
    由于现有方法几乎能满足所有需要,因此很少会创建新的分配方法。但是,几乎为每个类都要创建一个或多个新的初始化方法。由于分配和初始化阶段是分开的,初始化方法的实现只需要处理新实例的变量,并完全忽略有关分配的问题。
    分配和初始化分开的一个不良后果是,需要注意一些约定,比如指定初始化方法。你必须知道哪些方法是指定初始化方法,以及如何在子类中创建和记录新的初始化方法。从长期角度来讲,使用指定初始化方法能简化软件开发过程,但是对Cocoa开发者来说必须在早期就学习两阶段创建模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值