alloc和allocWithZone

来源:互联网 发布:襄阳华为云计算招聘 编辑:程序博客网 时间:2024/05/16 08:25
之前做项目的时候见过这样一个方法创建单例:

  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可以减少内存碎片
0 0
原创粉丝点击