美文网首页
内存管理copy

内存管理copy

作者: 越天高 | 来源:发表于2020-11-12 20:20 被阅读0次

    01

    copy的目的就是为了产生一个新的副本对象,修改副本对象,不会对影响原来的对象
    IOS提供了两个拷贝方法,

    1. copy不可变拷贝,产生不可变的副本
      2.mutablecCopy,产生可变的副本
    
            NSMutableString *testStr = [NSMutableString stringWithFormat:@"ddd"];
            NSString *str2 =  [testStr copy];//不可变
            NSMutableString *str3 = [testStr mutableCopy];//可变
    

    02深拷贝和浅拷贝

    通过copy产生的新的对象,相当于alloc出来的对象

     NSMutableString *testStr = [NSMutableString stringWithFormat:@"ddd"];
            NSString *str2 =  [testStr copy];//不可变
            NSMutableString *str3 = [testStr mutableCopy];//可变
            [testStr release];
            [str2 release];
            [str3 release
    
    copy出来的新对象

    copy的目的就是为了产生一个新的对象,修改互不影响,但是str1指向的是一个不可变的对象,所以copy出的也是一个不可变的对象,
    不可变对象copy新的对象还是指向原来的对象,相当于return

    • 深拷贝和浅拷贝
    1. 深拷贝,内容拷贝会产生新的对象,
      2.浅拷贝,指针拷贝,不会产生新的对象

    03taggedPointer与拷贝

    如果字符串是taggedPointer,他就不是真正的对象,那么饮用计数就不存在

    04NSArray和NSDictionary

            NSMutableArray *arr = [NSMutableArray array];
            NSArray *arr2 = [arr copy];//深拷贝
            NSMutableArray *arr3 = [arr mutableCopy];//深拷贝
    
    NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"jack",@"name" ,nil];
            NSDictionary *dic2 = [dic copy];//浅拷贝
            NSMutableDictionary *dic3 = [dic mutableCopy];//深拷贝
    
    copy和mutableCopy

    可变对象调用mutableCopy肯定是深拷贝,
    不可变对象调用copy是浅拷贝,其他都是深拷贝

    05@property copy

    - (void)setData:(NSData *)data
    {
        if (_data != data)
        {
            [_data release];
            _data = [data copy];
        }
    }
    

    但是如果是个可变的数组,执行copy策略,会报错,因为他是一个深拷贝,会生成一个不可变的数组
    创建IOS项目,字符串都是copy策略,他可以保证,这个字符串,肯定是不可变的,如果你想要改属性,就直接将整属性赋值一个新的文字,不希望他去修改原来的字符串

    06 自定义copy

    比如一个对象,已经有很多个属性被赋值,想直接生成一个新对象,含有他的那些属性值这时候就可以使用copy,
    关于可变和不可变只存在foundation框架中的类,其他对象是没有的,属性都是通用的所有不存在可变的copy策略,
    我们自定义的对象直接使用copy的话会报错,copyWithZone方法没有实现的错误,自定义的类要想copy首先需要遵守,NSCopying协议,然后实现copyWithZone方法

    - (id)copyWithZone:(struct _NSZone *)zone
    {
        Person *p = [[Person alloc] init];
        p.age = self.age;
        p.name = self.name;
        return p;
    }
    

    不存在mutableCopy策略

    相关文章

      网友评论

          本文标题:内存管理copy

          本文链接:https://www.haomeiwen.com/subject/lvglbktx.html