拷贝:顾名思义是复制一个对象,作为一个副本.
但是在面向对象里面拷贝分为浅拷贝与深拷贝.
浅拷贝: 只是简单的给对象引用计数+1,不会造成新开辟对象内存空间.
深拷贝:不会造成原本对象引用计数增加,但是会在内存中新开辟对象内存空间,内容与原本对象一致.
实例:
//
// main.m
// CopyDemo
//
// Created by 5016 on 13-12-16.
// Copyright (c) 2013年 dradon. All rights reserved.
//
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
@autoreleasepool {
//1.不可变copy--->拷贝不可变对象(和retain效果一致)
NSArray *arr1 = [[NSArray alloc] initWithObjects:@"android", @"iPhone",@"iMac",nil];
NSArray *arr2 =[arr1 copy];
NSLog(@"arr1=%@,地址=%p,引用计数=%ld,类型=%@",arr1,arr1,[arr1 retainCount],[arr1 class]);
NSLog(@"arr2=%@,地址=%p,引用计数=%ld,类型=%@",arr2,arr2,[arr2 retainCount],[arr2 class]);
//2.不可变copy--->拷贝可变对象(用copy拷贝出来的对象都是不可变的,因为copy是不可变的)
//对于生成新对象,称为深copy
NSMutableArray *arr3 = [[NSMutableArray alloc] initWithObjects:@"android", @"iPhone",@"iMac",nil];
NSArray *arr4 = [arr3 copy];
NSLog(@"arr3=%@,地址=%p,引用计数=%ld,类型=%@",arr3,arr3,[arr3 retainCount],[arr3 class]);
NSLog(@"arr4=%@,地址=%p,引用计数=%ld,类型=%@",arr4,arr4,[arr4 retainCount],[arr4 class]);
NSMutableArray *arr5 = [arr3 copy];
NSLog(@"arr5=%@,地址=%p,引用计数=%ld,类型=%@",arr5,arr5,[arr5 retainCount],[arr5 class]);
//3.可变copy--->拷贝不可变对象
NSArray *arr6 = [[NSArray alloc] initWithObjects:@"android", @"iPhone",@"iMac",nil];
NSMutableArray *arr7 = [arr6 mutableCopy];
NSLog(@"arr6=%@,地址=%p,引用计数=%ld,类型=%@",arr6,arr6,[arr6 retainCount],[arr6 class]);
NSLog(@"arr7=%@,地址=%p,引用计数=%ld,类型=%@",arr7,arr7,[arr7 retainCount],[arr7 class]);
//4.可变copy--->拷贝可变对象
NSMutableArray *arr8 = [[NSMutableArray alloc] initWithObjects:@"android", @"iPhone",@"iMac",nil];
NSMutableArray *arr9 = [arr8 mutableCopy];
NSLog(@"arr8=%@,地址=%p,引用计数=%ld,类型=%@",arr8,arr8,[arr8 retainCount],[arr8 class]);
NSLog(@"arr9=%@,地址=%p,引用计数=%ld,类型=%@",arr9,arr9,[arr9 retainCount],[arr9 class]);
}
return 0;
}