Objective-C基础教程 NSCopying 协议

本文深入解析了Objective-C中的NSCopying协议,阐述了其在对象复制中的作用,区分了浅拷贝与深拷贝的概念,并通过实例展示了如何在自定义类中实现copyWithZone方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

协议

NSCopying 协议是OC中的基本协议。

/***************    Basic protocols     ***************/

@protocol NSCopying

- (id)copyWithZone:(nullable NSZone *)zone;

@end

在CCYBook类中遵循这个协议,并实现该方法。

- (id)copyWithZone:(NSZone *)zone{
    CCYBook *book;
    book = [[[self class] allocWithZone:zone] init];
    return book;
}

如果不实现这个协议就无法调用对象的copy方法。因为copy方法会调用copyWithZone这个方法。

浅拷贝和深拷贝

看下面的代码

CCYBook *book = [[CCYBook alloc] init];
//CCYBook *abook = [book copy];

NSLog(@"book = %p", book);
NSArray *array = [NSArray arrayWithObjects:book, nil];
NSMutableArray *mutArray = [NSMutableArray arrayWithObjects:book, nil];
NSLog(@"array[0] = %p", array[0]);
NSLog(@"mutArray[0] = %p", mutArray[0]);

id arraycopy = [array copy];
id arraymutableCopy = [array mutableCopy];
id mutArraycopy = [mutArray copy];
id mutArraymutableCopy = [mutArray mutableCopy];
NSLog(@"**************************");
NSLog(@"arraycopy = %@", [arraycopy class]);
NSLog(@"arraymutableCopy = %@", [arraymutableCopy class]);
NSLog(@"mutArraycopy = %@", [mutArraycopy class]);
NSLog(@"mutArraymutableCopy = %@", [mutArraymutableCopy class]);
NSLog(@"**************************");
NSLog(@"array[0] = %p", array[0]);
NSLog(@"mutArray[0] = %p", mutArray[0]);
NSLog(@"arraycopy[0] = %p", arraycopy[0]);
NSLog(@"arraymutableCopy[0] = %p", arraymutableCopy[0]);
NSLog(@"mutArraycopy[0] = %p", mutArraycopy[0]);
NSLog(@"mutArraymutableCopy[0] = %p", mutArraymutableCopy[0]);
NSLog(@"**************************");

NSArray *depthCopyArray = [[NSArray alloc] initWithArray:mutArray copyItems:true];

NSLog(@"depthCopeArray[0] = %p", depthCopyArray);

创建一个图书类的对象,并把它加入数组中,对数组发送copy消息。输入结果如下:

2018-08-16 21:49:39.188019+0800 demo0816[1735:91988] book = 0x100601fa0
2018-08-16 21:49:39.188368+0800 demo0816[1735:91988] array[0] = 0x100601fa0
2018-08-16 21:49:39.188416+0800 demo0816[1735:91988] mutArray[0] = 0x100601fa0
2018-08-16 21:49:39.188488+0800 demo0816[1735:91988] **************************
2018-08-16 21:49:39.188518+0800 demo0816[1735:91988] arraycopy = __NSArrayI
2018-08-16 21:49:39.188544+0800 demo0816[1735:91988] arraymutableCopy = __NSArrayM
2018-08-16 21:49:39.188569+0800 demo0816[1735:91988] mutArraycopy = __NSSingleObjectArrayI
2018-08-16 21:49:39.188582+0800 demo0816[1735:91988] mutArraymutableCopy = __NSArrayM
2018-08-16 21:49:39.188591+0800 demo0816[1735:91988] **************************
2018-08-16 21:49:39.188603+0800 demo0816[1735:91988] array[0] = 0x100601fa0
2018-08-16 21:49:39.188614+0800 demo0816[1735:91988] mutArray[0] = 0x100601fa0
2018-08-16 21:49:39.188625+0800 demo0816[1735:91988] arraycopy[0] = 0x100601fa0
2018-08-16 21:49:39.188637+0800 demo0816[1735:91988] arraymutableCopy[0] = 0x100601fa0
2018-08-16 21:49:39.188647+0800 demo0816[1735:91988] mutArraycopy[0] = 0x100601fa0
2018-08-16 21:49:39.192014+0800 demo0816[1735:91988] mutArraymutableCopy[0] = 0x100601fa0
2018-08-16 21:49:39.192079+0800 demo0816[1735:91988] **************************
2018-08-16 21:49:39.192139+0800 demo0816[1735:91988] depthCopeArray[0] = 0x100604cf0

只有最后一个创建的数组,调用了对象的copyWithZone方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值