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

被折叠的 条评论
为什么被折叠?



