Objective-C基础教程 NSCopying 协议

版权声明:本文为博主原创文章,欢迎转载。 https://blog.csdn.net/chen12302asd/article/details/81749605

协议

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方法。

猜你喜欢

转载自blog.csdn.net/chen12302asd/article/details/81749605
今日推荐