• copy 和 MutableCopy


    1:copy拷贝得到的对象都是不可变对象,MutableCopy拷贝得到的对象都是可变对象。MutableCopy拷贝得到的对象都是新的对象,会重新分配内存地址,而copy拷贝的对象既可以是新对象,也有可能是原来的对象,也就是内存地址可能与原来相同,可通过打印对象的%p内存地址来查看。当copy一个对象时,若对象不可变,则拷贝出的新对象内存地址原对象内存地址相同,是同一个对象,但是当copy时,对象是可变的,新拷贝出来的对象内存地址会不同,也就是会得到一个新的对象。

    void string()
    {
        NSString *string = @"12";
        
        NSString *str1 = [string copy]; // 没有产生新对象
        NSMutableString *str2 = [string mutableCopy]; // 产生新对象
        
        NSLog(@"%p %p %p", string, [string copy], [string mutableCopy]);
    }
    
    void mutableString()
    {
        NSMutableString *string = [NSMutableString string];
        [string appendString:@"1"];
        [string appendString:@"2"];
        
        NSString *str1 = [string copy]; // 产生新对象
        NSMutableString *str2 = [string mutableCopy]; // 产生新对象
        [string appendString:@"345"];
     
    }

    2:深拷贝与浅拷贝:深拷贝也就是拷贝出的对象是新的对象,是内容的拷贝,浅拷贝没有产生新的对象,只是指针的拷贝

    3:@property中的copy:

    @interface XMGPerson : NSObject
    @property (nonatomic, assign) int age;
    @property (nonatomic, assign) double money;
    
    /** name属性值永远是不可变,所以定义为NSMutableString是不合理的 */
    @property (nonatomic, copy) NSMutableString *name;
    @end
    #import "XMGPerson.h"
    
    @interface XMGPerson() <NSCopying>
    
    @end
    
    @implementation XMGPerson
    
    - (id)copyWithZone:(NSZone *)zone
    {
        XMGPerson *person = [[XMGPerson allocWithZone:zone] init];
        person.age = self.age;
        return person;
    }
    
    //- (void)setName:(NSString *)name
    //{
    //    _name = [name copy];
    //}
    
    //- (id)mutableCopyWithZone:(NSZone *)zone
    //{
    //
    //}
    
    @end

    1:当字符串用copy修饰时,在set方法中其实调用了

     _name = [name copy];name经过copy之后,得到的对象是不可变的,所以属性用可变字符串修饰时不合理的。若是strong修饰字符串时,只是简单的赋值,将外界的值赋值给name,外界值更改,则属性值也会更改

    2:对象执行copy或是MutableCopy操作,内部会调用

    - (id)copyWithZone:(NSZone *)zone,id是返回的copy的对象,zone是为copy的对象开辟的空间,

    - (id)mutableCopyWithZone:(NSZone *)zone 两个方法前提都是先要遵守

    NSCopying 或是  NSMutableCopying协议

    4:当我们去自定义对象的时候,调用copy和mutableCopy两个方法,需要自己去遵守NSCopying, NSMutableCopying协议,并实现

    - (id)copyWithZone:(NSZone *)zone,- (id)mutableCopyWithZone:(NSZone *)zone。

     1 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
     2   
     3     Person *person1 = [[Person alloc]init];
     4     NSLog(@"person1的内存地址为----%p",person1);
     5     
     6     Person *person2 = [person1 copy];
     7     NSLog(@"person2的内存地址为----%p",person2);
     8     
     9     Person *person3 = [person1 copy];
    10     NSLog(@"person3的内存地址为----%p",person3);
    11     
    12     
    13 }
     1 #import "Person.h"
     2 @interface Person ()<NSCopying,NSMutableCopying>
     3 
     4 
     5 @end
     6 @implementation Person
     7 
     8 
     9 - (instancetype)copyWithZone:(NSZone *)zone {
    10     
    11     Person *person  = [[Person allocWithZone:zone] init];
    12     return person;
    13 }
    14 
    15 - (instancetype)mutableCopyWithZone:(NSZone *)zone {
    16     
    17     Person *person = [Person allocWithZone:zone];
    18     return person;
    19 }
    20 
    21 @end

    知识总结:1:非自定义类调用copy都得到不可变对象,有可能会产生新对象,有可能不产生新对象,mutableCopy得到的对象都是可变的,会产生新对象,深拷贝,是内容拷贝,产生新对象,浅拷贝是指针拷贝,不产生新对象。2:当自定义类时,调用copy和mutableCopy都需要遵守NSCopying, NSMutableCopying协议,实现- (id)copyWithZone:(NSZone *)zone,- (id)mutableCopyWithZone:(NSZone *)zone,分别打印三个内存地址,得到的内存地址都不一样,则自定义类无论调用copy和mutableCopy都产生了新对象。

  • 相关阅读:
    实践详细篇-Windows下使用Caffe训练自己的Caffemodel数据集并进行图像分类
    实践详细篇-Windows下使用VS2015编译的Caffe训练mnist数据集
    实践详细篇-Windows下使用VS2015编译安装Caffe环境(CPU ONLY)
    Linux上rpm实战搭建FTP服务器
    Idea打包Maven项目
    修改Idea默认的全局设置,如Maven等
    IntelliJ IDEA 项目结构旁边出现 0%classes,0% lines covered
    Idea中JDK为1.8,还提示Diamond types are not supported at this language level
    如何避免在父类转换到子类时发生java.lang.ClassCastException
    HashMap常用方法总结
  • 原文地址:https://www.cnblogs.com/cqb-learner/p/5716748.html
Copyright © 2020-2023  润新知