深复制 浅复制

深复制:不仅复制对象 还复制对象关联的对象

浅复制:只是复制对象本身 不复制对象关联的对象

//
//  main.m
//  对象的复制
//
//  Created by MAC on 15/12/20.
//  Copyright © 2015年 MAC. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //深复制  把对象关联的对象也复制
        NSMutableString *m1 = [NSMutableString stringWithString:@"one"];
         NSMutableString *m2 = [NSMutableString stringWithString:@"two"];
         NSMutableString *m3 = [NSMutableString stringWithString:@"three"];

        NSMutableArray *arr = [NSMutableArray arrayWithCapacity:10];
        [arr addObject:m1];
        [arr addObject:m2];
        [arr addObject:m3];
        NSMutableArray *arr1 = [arr mutableCopy];//只是赋值对象本身 关联的对象不复制  浅复制
        NSLog(@"%@",arr);
         NSLog(@"%@",arr1);

       // [arr removeObject:@"one"]; //删除字符串不会影响

        [arr1 removeAllObjects];
        for (NSObject *s in arr) {      //深复制
            NSObject *temp = [s mutableCopy]; //把里面的对象拿出来复制给另一个数组
            [arr1 addObject:temp];
        }

        [m1 insertString:@"changed" atIndex:1]; //浅复制情况下改变数组的关联对象也会受影响 但深复制不受影响
        NSLog(@"%@",arr);
        NSLog(@"%@",arr1);
//        //浅复制
//        // copy
//        //mutableCopy 可变的
        NSMutableString *str = [NSMutableString stringWithString:@"Hello World"];
        NSMutableString *str2 = str;
        NSLog(@"%p",str);
        NSLog(@"%p",str2);
        [str insertString:@"Changed" atIndex:3];
        //修改第一个第二个String也被修改 因为内存地址一样
        NSLog(@"%@",str);
        NSLog(@"%@",str2);
//
        NSMutableArray *array = [NSMutableArray arrayWithCapacity:10];
        [array addObject:@"1"];
        [array addObject:@"2"];
        [array addObject:@"3"];
        NSMutableArray *array2 = array;  //内存地址一样
        NSLog(@"%p",array);
        NSLog(@"%p",array2);
        [array removeObject:@"2"];

       array2 = [array mutableCopy]; //copy内存地址不一样
        NSLog(@"%p",array);
        NSLog(@"%p",array2);
//
//
        //自定义对象复制
        Person *per = [[Person alloc]init];
        per->age = 20;
        Person *p2 = per;       //内存地址一样 NSString
       Person *p3 = [per copy];   //-[Person copyWithZone:]: unrecognized selector sent to instance 没有找到此方法 需要实现NSCopying协议里面的- (id)copyWithZone:(nullable NSZone *)zone;方法
        NSLog(@"=%p",per);
        NSLog(@"=%p",p3);
        NSLog(@"%d",p2->age);
        per->age = 10;
        NSLog(@"%d",p2->age);

        NSMutableSet *mset = [NSMutableSet setWithCapacity:10];
        [mset addObject:@"one"];
        [mset addObject:@"two"];
        [mset addObject:@"three"];
        [mset addObject:@"four"];
        NSMutableSet *mset2 = [mset mutableCopy]; //使用mutableCopy 内存地址不一样
        NSLog(@"%p",mset);
        NSLog(@"%p",mset2);

    }
    return 0;
}
//
//  Person.h
//  对象的复制
//
//  Created by MAC on 15/12/20.
//  Copyright © 2015年 MAC. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Person : NSObject<NSCopying>
{
    @public
    int age;

}
@property(nonatomic)int age;
@property(nonatomic,copy)NSString *name;
@property(nonatomic)int num;
@end
//
//  Person.m
//  对象的复制
//
//  Created by MAC on 15/12/20.
//  Copyright © 2015年 MAC. All rights reserved.
//

#import "Person.h"

@implementation Person
- (id)copyWithZone:(nullable NSZone *)zone{
    Person *per = [[Person allocWithZone:zone]init];
    NSLog(@"copy per");
    return per;
}
@end
时间: 2024-10-10 14:07:41

深复制 浅复制的相关文章

简单理解php深复制浅复制问题

其实接触深复制浅复制是通过学习c++了解到的,比如c++很好用的模板,php是不允许方法模板和类模板 一个简单的例子,如果不是很了解php 的取地址符&,可以去看下官方文档,php的&就是别名 class zx{ public $r ='44444444<br>'; public function __construct() { } public function ccccc() { echo $this->r; } } $rr = new zx(); //$ee = $

OpenCv学习笔记(四)--Mat基本图像容器Mat对象信息头,矩阵体的创建,深复制,浅复制详解

1--我们知道Mat是一个图像容器类,这个数据结构由两部分组成: 1--矩阵头--即class Mat类所实例化的类对象所开辟的空间里面存储的数据---就是这个矩阵的信息,当我们以 Mat object;这样声明类对象的时候,也仅仅是创建了一个Mat的信息头,并没有创建矩阵体,也就是说,我们并 没有给将要存储的图像开辟相应的空间 2--矩阵头--包含: 1--矩阵的尺寸----比如---class Mat这个类中的----数据成员rows,cols---就可以指定图像的尺寸 2--存储方法---

【C/C++】复制构造函数、深复制浅复制

常见问题 Q1. 下面代码的输出结果是( )? 1 #include <iostream> 2 using namespace std; 3 4 class MyClass 5 { 6 public: 7 MyClass(int n) { number = n; } 8 MyClass(const MyClass &other) 9 { 10 number = other.number; 11 cout << "a "; 12 } 13 private:

iOS学习(二)之深复制&amp;浅复制

1.无论是深复制还是浅复制,被复制的对象类型是不变的.此对象类型具有什么功能就具有什么功能,不会因为自行修改了返回对象的指针类型而改变. 比如: 这里的str和str1的值和指针地址完全一样,因为是不可变类型使用了copy,什么都不变.为什么NSNumber类型的指针可以指向NSSring类型copy出的对象呢?因为copy返回类型为id万能指针类型.如果返回的是instancetype就会警告. 记住:对于不可变的临时变量使用浅复制copy没什么用,地址和值都一样. 2.怎么理解最后一句话?

复制构造函数——深复制 浅复制

隐含的复制构造函数并不总是适用的,因为它完成的只是浅复制. 对象的浅复制 1 #include<iostream> 2 #include<cassert> 3 using namespace std; 4 class Point{ 5 public: 6 Point() :x(0), y(0)//默认构造函数 7 { 8 cout << "constructor1" << endl; 9 } 10 Point(int x, int y)

Python深复制浅复制or深拷贝浅拷贝

1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象.(比深拷贝更加节省内存) 2. copy.deepcopy 深拷贝 拷贝对象及其子对象 小例子: import copy a = [1, 2, 3, 4, ['a', 'b', 'c']] b = a c = copy.copy(a) d = copy.deepcopy(a) print(id(a))#2552169009288 print(id(b))#2552169009288 print(id(c))#255216

iOS中的深复制与浅复制

很多语言中都有深复制浅复制的概念,如C++,ObjC等.简单来说,浅复制就是两个变量指向了同一块内存区域,深复制就是两个变量指向了不同的内存区域,但是两个内存区域里面的内容是一样的. 浅复制示意图: 深复制示意图: iOS开发中,浅复制和深复制要更复杂一些,涉及到集合对象和非集合对象的copy与mutableCopy. 非集合对象:如NSString,NSInteger,NSNumber…… 集合对象:如NSArray,NSDictionary,…… 1:非集合对象的copy与mutableCo

python中深复制与浅复制

转载:http://blog.csdn.net/vicken520/article/details/8227524 java中也经常碰见这种问题.时间原因就不写java方面啦 Python深复制浅复制or深拷贝浅拷贝 简单点说 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象.2. copy.deepcopy 深拷贝 拷贝对象及其子对象 用一个简单的例子说明如下: >>>import copy>>>a = [1, 2, 3, 4, ['a', 

关于深复制与浅复制

转自“红黑联盟”,网址:http://www.2cto.com/kf/201405/302273.html 第一.复制对象的基本概念 复制一个对象为副本,开辟一块新的内存来存储副本对象. 第二.如果一个对象想具备复制的功能,必须实现协议和协议 NSObject自带的常用的对象有:NSNumber.NSString.NSArray.NSDictionary.NSMutableArray.NSMutableDictionay.NSMutableString,copy产生的对象时不可变的,mutabl