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可以减少内存碎片
在 Objective-C 中,深拷贝(Deep Copy)浅拷贝(Shallow Copy)是用于复制对象的两种不同方式。 浅拷贝是指创建一个新的对象,该对象与原始对象共享数据的内存地址。换句话说,新对象只是原始对象的一个引用,对新对象的修改也会影响原始对象。在 Objective-C 中,可以使用 `copy` 方法来执行浅拷贝。 深拷贝是指创建一个新的对象,并且复制原始对象的所有数据。这意味着新对象有自己的内存地址,对新对象的修改不会影响原始对象。在 Objective-C 中,可以使用 `mutableCopy` 方法来执行深拷贝。 需要注意的是,深拷贝只会复制对象本身,而不会递归地复制对象所包含的其他对象。如果需要对对象的所有数据进行递归复制,可以通过实现 NSCopying 协议来自定义深拷贝操作。 下面是一个示例代码,演示了如何执行浅拷贝深拷贝: ```objective-c #import <Foundation/Foundation.h> @interface Person : NSObject <NSCopying> @property (nonatomic, copy) NSString *name; @end @implementation Person - (instancetype)copyWithZone:(NSZone *)zone { Person *copy = [[Person allocWithZone:zone] init]; copy.name = self.name; return copy; } @end int main(int argc, const char * argv[]) { @autoreleasepool { Person *person1 = [[Person alloc] init]; person1.name = @"John"; // 浅拷贝 Person *person2 = [person1 copy]; NSLog(@"person1: %@, person2: %@", person1.name, person2.name); // 输出:person1: John, person2: John // 深拷贝 Person *person3 = [person1 mutableCopy]; person3.name = @"Emily"; NSLog(@"person1: %@, person3: %@", person1.name, person3.name); // 输出:person1: John, person3: Emily } return 0; } ``` 在上面的示例中,使用 `copy` 方法执行了浅拷贝操作,`mutableCopy` 方法执行了深拷贝操作。注意,为了实现深拷贝,我们在 `Person` 类中遵循了 NSCopying 协议,并重写了 `copyWithZone:` 方法来自定义深拷贝操作。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值