alloc和allocWithZone

本文探讨了单例模式在Objective-C中的实现方法,并详细解释了alloc与allocWithZone的区别及NSZone的作用。通过实际代码示例展示了如何确保单例模式的正确实现,同时讨论了NSZone在内存管理中的应用。
之前做项目的时候见过这样一个方法创建单例:

  1. static MyGizmoClass *sharedGizmoManager = nil; 
  2. + (MyGizmoClass*)sharedManager 
  3. if (sharedGizmoManager == nil) { 
  4. sharedGizmoManager = [[super allocWithZone:NULL] init]; 
  5. return sharedGizmoManager; 
  6. + (id)allocWithZone:(NSZone *)zone 
  7. return [[self sharedManager] retain]; 
  8. }
alloc和allocWithZone有什么区别?
memroy zone已经弃用,但为什么还保留这接口,是个历史遗留问题。有实践证明,alloc执行的时候默认调用allocWithZone方法,
这个创建单例的例子是想,当对象存在时,禁止再用alloc,保证单例,这就很好理解他为什么要覆盖allocWithZone函数了。覆盖了allocWithZone方法就堵死了所有创建新对象的方法。
NSZone的真面目是Apple分配和释放内存的方式,使用C结构存储关于对象存储管理的信息,而不是对象。我的理解就是,NSZone就是一块划出来的、连续的内存空间,每次创建对象时,都从这块空间上划分,释放NSZone时,NSZone上的对象会全部被释放。不会造成碎片。
ApplIication框架有一个默认的NSZone,一般情况下我们是用不到自己创建NSZone的,但是当我们创建一个大内存的对象时,就可能会用到NSZone。
这是因为,Apple想填充碎片,创建对象时优先扫描内存间隙,也就是碎片,这会造成很大的时间开销,这时你可以自己创建一个NSZone,创建大内存的对象时直接存到指定的空间,也就是自己创建的NSZone里面去,这样就可以节省很多时间,而且,多个对象在同一时间alloc可以减少分页使用,而且在同一个时间dealloc可以减少内存碎片
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值